包含员工 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 中最慢的循环。
我在优化此 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 中最慢的循环。