繁体   English   中英

PowerShell Office 365脚本可同时获取用户和邮箱信息

[英]PowerShell Office 365 Script to get user and mailbox information together

我是PowerShell的新手(今天早上开始)。 我已经成功连接到我的Office 365,并且能够从Office 365中获得用户列表,并能够从Exchange部分获得邮箱字段。 我不知道如何结合它们。

我正在寻找的功能是能够从邮箱对象中导出某些字段,但只能导出属于非阻塞,许可Office 365用户的那些邮箱。 我们有许多用户的邮箱尚未被删除,但它们可能不再被许可或被阻止。

这是我现在运行的两个出口。 他们是完整的出口。 我试图通过isLicensed筛选Office 265用户,但没有得到任何结果,所以我只下载了所有内容并用Excel对它们进行了后期处理。 但是我需要定期运行...

这是代码:

Get-Mailbox -ResultSize Unlimited | Select-Object DisplayName,Name,PrimarySMTPAddress,CustomAttribute2 | Export-CSV  C:\temp\o365\mailboxes.csv
Get-MsolUser -all | Select-Object SignInName, DisplayName, Office, Department, Title, IsLicensed | export-csv c:\temp\o365\Users.csv

任何援助将不胜感激。

好的,据我所知,您要尝试执行的操作...您想获取IsLicensed属性为$trueBlockCredential属性为$false的所有O365用户的列表。 然后,在这些用户中,您想从其邮箱对象中提取一些数据; DisplayName,Name,PrimarySMTPAddress和CustomAttribute2。

我们可以通过两种方法来做到这一点。 第一种方法更容易放在外壳中,但是实际运行需要更长的时间。 第二个步骤需要进行一些设置,但可以快速完成。

第一种方法

由于我们知道从Get-MsolUser条件的标准,因此我们将使用管道提取所需的信息并将其直接扔到Get-Mailbox

Get-MsolUser -All | Where-Object {$_.IsLicensed -eq $true -and $_.BlockCredential -eq $false} | 
Select-Object UserPrincipalName | 
ForEach-Object {Get-Mailbox -Identity $_.UserPrincipalName | Select-Object DisplayName,Name,PrimarySMTPAddress,CustomAttribute2}

O365 PowerShell不喜欢给我们提供过滤初始查询的方法,因此我们在第二步(此处)进行处理。

Where-Object {$_.IsLicensed -eq $true -and $_.BlockCredential -eq $false}

这意味着,对于从Get-MsolUser -All传入的每个项目,我们只希望将属性Islicensed设置为$ true并将BlockCredential设置为$ false的那些项。

现在,在确定要查找哪些邮箱方面,我们只关心Get-MsolUser的结果,因此我们将从与我们先前的过滤器匹配的每个对象中获取一个属性。

Select-Object UserPrincipalName

如果您只运行到目前为止的所有内容,那么您将在外壳程序中获得UPN的列表,该列表包含了我们现在要传递到Get-Mailbox所有帐户。

继续我们的循环...如果您还没有学习ForEach-Object ,它用于对管道中的每个项目一次运行一个脚本块( {}之间的所有内容)。

Get-Mailbox -Identity $_.UserPrincipalName

欢迎使用管道运算符( $_ )。 我们之前的Select-Object通过管道提供了一组对象,并且在我们处理它们时,该占位符变量将容纳每个对象。 由于这些对象都具有UserPrincipalName属性,因此我们将其引用以将值传递给Get-MailboxIdentity参数。


侧边栏

这是一个简单的例子。

PS> 1,2,3 | ForEach-Object {Write-Host $_}
1
2
3

每一项都沿着管道传递,我们在其中一次将它们写出来。 这与您的标准foreach循环非常相似。 您可以在此Scripting Guy帖子中了解有关它们差异的更多信息

继续...


Select-Object DisplayName,Name,PrimarySMTPAddress,CustomAttribute2

我们用最后一个Select-Object包装了您想要的信息。 然后,您可以查看外壳程序或导入Export-Csv以便在Excel中使用的结果。

现在...由于管道按顺序工作,因此有一些开销。 我们正在运行一个命令,收集结果,然后一次将这些结果传递给下一个命令。 当我们到达Get-Mailbox ,实际上对于收集到的每个UPN都运行一次Get-Mailbox 在我的组织中,这大约需要2.5分钟,而我们的邮箱不到500个。 如果您要处理大量文件,则运行此文件的时间可能会很快增加。

第二种方法

由于第一种方法的大量处理开销与使用管道有关,因此我们可以通过尽早而彻底地处理我们的数据收集来消除大部分开销。

$Users = Get-MsolUser -All | Where-Object {$_.IsLicensed -eq $true -and $_.BlockCredential -eq $false} | Select-Object -ExpandProperty UserPrincipalName
$Mailboxes = Get-Mailbox | Select-Object UserPrincipalName,DisplayName,Name,PrimarySMTPAddress,CustomAttribute2

$Results = foreach ($User in $Users) {
    $Mailboxes | Where-Object UserPrincipalName -eq $User
}

$Results | Export-Csv myFile.csv

前两行很不言自明。 我们获得了我们关心的所有用户帐户信息(仅是UPN),然后获取了我们关心的所有邮箱属性。

foreach ($User in $Users)

$Users每个条目将存储在$User ,然后在后面的脚本块(在{} )中使用它。

$Mailboxes | Where-Object UserPrincipalName -eq $User

$Mailboxes每个项目都通过管道UserPrincipalNameWhere-Object ,然后我们Where-Object其中检查UserPrincipalName属性是否等于$User的当前值。 然后,所有匹配项都存储在$Results ,该值可以再次通过管道传输到Export-Csv以在Excel中工作。

尽管此方法很难在Shell中写出,并且需要一些额外的初始设置,但运行速度明显更快。 我的组织机构需要22秒,而第一种方法需要2.5分钟。

我还应该指出,将UserPrincipalName与邮箱数据集一起使用UserPrincipalName是为了帮助确保它们与帐户数据集之间的牢固匹配。 如果您不希望在最终结果中使用它,则始终可以将$Results管道Select-Object到另一个Select-Object并仅指定您关心的属性。

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM