如何合并PowerShell脚本导出Azure AD组的成员与所有者至CSV
合并Azure AD组成员与所有者导出脚本的解决方案
当然可以将两个脚本合并,以下是整合后的PowerShell脚本,它会一次性导出所有Azure AD组的成员信息与对应组的所有者信息,同时处理了无成员、无所有者等边界场景:
Connect-AzureAD $results = @() # 获取所有Azure AD组 $groups = Get-AzureADGroup -All $true foreach ($group in $groups) { # 获取当前组的成员列表 $members = Get-AzureADGroupMember -ObjectId $group.ObjectId -All $true # 获取当前组的所有者列表 $owners = Get-AzureADGroupOwner -ObjectId $group.ObjectId -All $true # 处理无成员的组 if (-not $members) { if ($owners) { # 无成员但有所有者,生成对应条目 foreach ($owner in $owners) { $output = [PSCustomObject]@{ "组名称" = $group.DisplayName "成员名称" = $null "成员对象类型" = $null "成员用户类型" = $null "成员用户主体名称" = $null "所有者对象ID" = $owner.ObjectId "所有者对象类型" = $owner.ObjectType "所有者用户类型" = $owner.UserType "所有者用户主体名称" = $owner.UserPrincipalName } $results += $output } } else { # 无成员也无所有者,生成空条目 $output = [PSCustomObject]@{ "组名称" = $group.DisplayName "成员名称" = $null "成员对象类型" = $null "成员用户类型" = $null "成员用户主体名称" = $null "所有者对象ID" = $null "所有者对象类型" = $null "所有者用户类型" = $null "所有者用户主体名称" = $null } $results += $output } continue } # 遍历每个成员,关联对应组的所有者 foreach ($member in $members) { if ($owners) { # 组有多个所有者时,每个成员与每个所有者分别生成一行 foreach ($owner in $owners) { $output = [PSCustomObject]@{ "组名称" = $group.DisplayName "成员名称" = $member.DisplayName "成员对象类型" = $member.ObjectType "成员用户类型" = $member.UserType "成员用户主体名称" = $member.UserPrincipalName "所有者对象ID" = $owner.ObjectId "所有者对象类型" = $owner.ObjectType "所有者用户类型" = $owner.UserType "所有者用户主体名称" = $owner.UserPrincipalName } $results += $output } } else { # 组无所有者时,生成成员+空所有者字段的条目 $output = [PSCustomObject]@{ "组名称" = $group.DisplayName "成员名称" = $member.DisplayName "成员对象类型" = $member.ObjectType "成员用户类型" = $member.UserType "成员用户主体名称" = $member.UserPrincipalName "所有者对象ID" = $null "所有者对象类型" = $null "所有者用户类型" = $null "所有者用户主体名称" = $null } $results += $output } } } # 导出整合后的结果到CSV文件 $results | Export-Csv -Encoding UTF8 -Path "D:\Script\AzureADGroups_Members_Owners.csv" -NoTypeInformation
脚本优化说明
- 使用
[PSCustomObject]创建输出对象,比原脚本的New-Object更简洁高效 - 统一处理了各种边界场景:无成员的组、无所有者的组、多成员多所有者的组
- 字段名称使用中文,更易理解(如需英文可自行替换字段名)
- 避免了原所有者脚本中全局哈希表可能导致的数据覆盖问题
内容的提问来源于stack exchange,提问作者Raybanz_UK
相关产品推荐
相关产品推荐

