通过PowerShell脚本导出Azure AD含嵌套组的用户列表及所属组
解决Azure AD嵌套组成员导出问题
原脚本报错原因
你遇到的Get-AzureADGroupMember : Cannot bind argument to parameter 'ObjectId' because it is null错误,以及无法整合用户和组信息的问题,根源在于:
- 递归逻辑错误:直接对成员集合
$members判断ObjectType,而非遍历单个成员;递归调用时命令名拼写错误(Get-AzureADGroupMembers多了末尾的s),且未定义$member变量 - 代码结构混乱:用户判断逻辑在
ForEach ($group in $groups)循环外部,无法正确关联每个组的成员 - 未实现真正的递归遍历:无法处理多层嵌套的子组
修正后的PowerShell脚本
以下脚本会递归遍历目标组及其所有嵌套子组,收集用户的用户名、邮箱(UserPrincipalName)、所属组名称信息,并导出为CSV文件:
# 连接Azure AD Connect-AzureAD # 定义递归函数遍历组及其嵌套子组 function Get-NestedGroupMembers { param( [Parameter(Mandatory=$true)] [string]$GroupObjectId, [Parameter(Mandatory=$true)] [string]$GroupName ) $members = Get-AzureADGroupMember -ObjectId $GroupObjectId -All $true foreach ($member in $members) { if ($member.ObjectType -eq 'User') { # 创建用户对象,关联所属组信息 [PSCustomObject]@{ "所属组名称" = $GroupName "用户名" = $member.DisplayName "邮箱" = $member.UserPrincipalName "用户类型" = $member.UserType } } elseif ($member.ObjectType -eq 'Group') { # 递归遍历子组 Get-NestedGroupMembers -GroupObjectId $member.ObjectId -GroupName $member.DisplayName # 如果需要同时记录用户属于顶层父组,可取消下面注释 # Get-NestedGroupMembers -GroupObjectId $member.ObjectId -GroupName $GroupName } } } # 目标组名称 $targetGroupName = "my-group-name" # 获取目标组对象 $targetGroups = Get-AzureADGroup -SearchString $targetGroupName # 初始化结果集合 $results = @() # 遍历每个目标组,收集成员 foreach ($group in $targetGroups) { $results += Get-NestedGroupMembers -GroupObjectId $group.ObjectId -GroupName $group.DisplayName } # 导出到CSV文件(注意修改路径为你的实际路径) $results | Export-Csv -Path "C:\Users\Desktop\aadgroupmembers.csv" -Encoding UTF8 -Delimiter ";" -NoTypeInformation
脚本说明
- 使用递归函数
Get-NestedGroupMembers处理多层嵌套组,自动遍历子组 - 明确区分用户和组类型,仅收集用户信息并关联所属组
- 导出的CSV包含你需要的核心字段:所属组名称、用户名、邮箱、用户类型
- 若需要记录用户属于顶层父组而非直接子组,可取消函数中对应注释行
内容的提问来源于stack exchange,提问作者MoOn
相关产品推荐
相关产品推荐

