代码之家  ›  专栏  ›  技术社区  ›  Menachem Bazian

PowerShell Office 365脚本,用于将用户和邮箱信息收集在一起

  •  2
  • Menachem Bazian  · 技术社区  · 7 年前

    代码如下:

    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
    

    如有任何帮助,我们将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  5
  •   mroloff    7 年前

    好吧,我明白你想做什么了。。。您希望获得所有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 使用邮箱数据集只是为了帮助确保它们与帐户数据集之间的可靠匹配。如果你不想在你的最终结果中看到它,你可以随时用管道 $结果 变成另一个 并仅指定您关心的属性。