好吧,我明白你想做什么了。。。您希望获得所有O365用户的列表
IsLicensed
属性为
$true
和
BlockCredential
$false
我们有几种方法可以做到这一点。第一种更容易在外壳中组装,但实际运行需要更长的时间。第二个需要一些设置,但完成得很快。
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,并且
阻止凭据
设置为$false。
现在,我们只关心
获取MsolUser
Select-Object UserPrincipalName
如果您只运行到这一点,您将在shell中获得一个UPN列表,其中列出了我们现在要进入的所有帐户
获取邮箱
.
ForEach-Object
{}
)针对管道中的每个项目,一次一个。
Get-Mailbox -Identity $_.UserPrincipalName
欢迎来到管道运营商(
$_
Select-Object
正在通过管道提供一个对象集合,当我们处理它们时,这个占位符变量将保存每个对象。因为这些物体都有一个
UserPrincipalName
Identity
参数
.
边栏
这里有一个简单的例子来说明这是如何工作的。。
PS> 1,2,3 | ForEach-Object {Write-Host $_}
1
2
3
每个项目都沿着管道传递,我们在管道中一次写一个项目。这与您的标准非常相似
foreach
this Scripting Guy post
继续。。。
Select-Object DisplayName,Name,PrimarySMTPAddress,CustomAttribute2
获取您想要的信息。然后,您可以在shell或管道中查看结果
Export-Csv
现在由于管道按顺序工作,因此会有一些开销。我们正在运行一个命令,收集结果,然后将这些结果一次一个地传递给下一个命令。当我们到达我们的
获取邮箱
第二种方法
由于第一种方法中的大量处理开销与使用管道有关,我们可以通过尽早彻底地处理数据收集来消除大部分开销。
$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
被输送到
Where-Object
然后我们检查
UserPrincipalName
. 然后将所有匹配项存储在
$Results
用于Excel中的工作。
虽然这种方法很难在shell中写出,并且需要一些额外的初始设置,但它的运行速度要快得多;对于我的组织来说是22秒,而第一种方法是2.5分钟。
UserPrincipalName
使用邮箱数据集只是为了帮助确保它们与帐户数据集之间的可靠匹配。如果你不想在你的最终结果中看到它,你可以随时用管道
$结果
变成另一个
并仅指定您关心的属性。