包含员工 ID 和经理的 AzureAD 完整名册报告

AzureAD Full Roster Report with Employee ID and Manager

我在优化此 PowerShell 脚本时遇到问题。目前需要 8 个小时才能完成。我知道问题是由于 ForEach 公式导致的 Get-AllAzureADUsers 函数。我想通过只需要它查询存储在变量中的数据而不是我们租户中所有 80k 用户的系统来加快速度,但我正在努力解决这个问题。我还是 Powershell 的新手,但需要它每周提取一次报告,我真的希望能尝试缩短这个 运行 时间。

param (
    [string]$path = "C:\Temp\ADUsers-$((Get-Date -format "MM-dd-yyyy").ToString()).csv"

Function Get-Users{
   process {
      $properties = @(
         'ObjectId',
         '@{N="EmployeeId";E={_.ExtensionProperty["employeeId"]}',
         'DisplayName',
         'Surname',
         'givenName',
         'UserPrincipalName',
         'JobTitle',
         'CompanyName'
         '@{N="License":E={$_.ExtensionProperty["extension_a92a_msDS_cloudExtensionAttribute1"]}
       )
       Get-AzureADUser -Full $true -Filter 'accountEnabled eq true' | select $properties
    }
}

Function Get-AllAzureADUsers {
    process {
        $users = @()
        $users =+ Get-Users
        $users | ForEach {
             $manager = Get-AzureADUserManager -ObjectId $_.ObjectId | Select -ExpandProperty UserPrincipalName

             [pscustomobject]@{
             "Employee ID" = (Get-AzureADUser -ObjectID $_.ObjectId).ExtensionProperty["employeeId"]
             "First Name" = $_.surname
             "Last Name" = $_.givenName
             "Work Email" = $_.UserPrincipalName
             "Job Title" = $_.JobTitle
             "Department" = $_.CompanyName
             "Manager Email" = $manager
             "License" = (Get-AzureADUser -ObjectId $_.ObjectId).ExtensionProperty["extension_a92a_msDS_cloudExtensionAttribute1"]
             }
         }
     }
}
Get-AllAzureADUsers | Sort-Object Name | Export-CSV -Path $path -NoTypeInformation

您的代码似乎可以简化为:

param(
    [string] $path = "C:\Temp\ADUsers-$(Get-Date -format "MM-dd-yyyy").csv"
)

& {
    foreach($azuser in Get-AzureADUser -All $true -Filter 'accountEnabled eq true') {
        [pscustomobject]@{
            "Employee ID"   = $azuser.ExtensionProperty["employeeId"]
            "First Name"    = $azuser.surname
            "Last Name"     = $azuser.givenName
            "Work Email"    = $azuser.UserPrincipalName
            "Job Title"     = $azuser.JobTitle
            "Department"    = $azuser.CompanyName
            "Manager Email" = (Get-AzureADUserManager -ObjectId $azuser.ObjectId).UserPrincipalName
            "License"       = $azuser.ExtensionProperty["extension_a92a_msDS_cloudExtensionAttribute1"]
        }
    }
} | Export-CSV -Path $path -NoTypeInformation

花费这么长时间的主要原因是因为您在 Get-Users 函数中查询所有启用的用户,然后您在 Get-AllAzureADUsers 函数中再次查询他们 2 次。您还可以一次查询和构建所需的输出。

您还按 Name (Sort-Object Name) 排序,但是您的 Get-AllAzureADUsers 函数没有返回带有 属性 的对象,因此除了枚举所有输出。

最后,您使用 ForEach-Object 枚举所有用户,这可能是 PowerShell 中最慢的循环。