如何用PowerShell导出所有AD组成员?成员缺失问题求解
问题原因分析
- 成员仅存在于Azure AD(本地无对应对象):如果这些组的成员是仅云用户(未同步至本地AD),或是Azure AD专属组类型(如动态组、纯云安全组),本地AD的组对象不会同步这类成员信息,导致
Get-ADGroup读取不到成员。 - 跨域权限不足:多域森林环境中,执行查询的账号未被授予目标域的组读取权限,无法获取跨域组的
member属性。 - AD查询属性限制:默认情况下,
Get-ADGroup的LDAP查询存在页面大小或多值属性返回限制,若组的成员数量超出阈值,可能导致member属性返回为空(这种情况更多是部分缺失,但部分场景下会完全无返回)。 - 组对象属性异常:部分组的
member属性在本地AD中同步失败或存在损坏,导致无法正常读取。
导出所有组成员的最佳方法
方法1:直接从Azure AD/Graph API获取
既然成员实际存在于Azure AD,从云端查询是最准确的方式,适合大规模组数据:
使用Microsoft Graph PowerShell模块(推荐)
# 连接Graph,需Group.Read.All权限 Connect-MgGraph -Scopes "Group.Read.All" # 分页获取所有组 $groups = Get-MgGroup -All $true # 遍历组并导出成员 foreach ($group in $groups) { # 获取组的所有成员,过滤用户类型 $members = Get-MgGroupMember -GroupId $group.Id -All $true | Where-Object {$_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.user'} # 输出到CSV(追加模式) $members | Select-Object ` @{Name="GroupName"; Expression={$group.DisplayName}}, @{Name="MemberUPN"; Expression={$_.UserPrincipalName}}, @{Name="MemberId"; Expression={$_.Id}} ` | Export-Csv -Path "AzureAD_Group_Members.csv" -Append -NoTypeInformation }
使用AzureAD模块(兼容旧环境)
# 连接Azure AD Connect-AzureAD # 获取所有组 $groups = Get-AzureADGroup -All $true foreach ($group in $groups) { $members = Get-AzureADGroupMember -ObjectId $group.ObjectId -All $true | Where-Object {$_.ObjectType -eq "User"} $members | Select-Object ` @{Name="GroupName"; Expression={$group.DisplayName}}, UserPrincipalName, ObjectId ` | Export-Csv -Path "AzureAD_Group_Members.csv" -Append -NoTypeInformation }
方法2:优化本地AD查询(若需从本地获取)
如果必须从本地AD导出,需确保账号有跨域权限,并调整查询参数:
# 获取所有组,指定读取member属性,绕过结果集大小限制,可指定目标域DC $allGroups = Get-ADGroup -Filter * -Properties member -ResultSetSize $null -Server "目标域DC地址" foreach ($group in $allGroups) { if ($group.member) { foreach ($memberDN in $group.member) { # 解析成员对象,忽略查询失败的条目 $member = Get-ADObject -Identity $memberDN -Properties Name, UserPrincipalName -ErrorAction SilentlyContinue [PSCustomObject]@{ GroupName = $group.Name MemberName = $member.Name MemberUPN = $member.UserPrincipalName MemberDN = $memberDN } } } else { # 记录无成员的组 [PSCustomObject]@{ GroupName = $group.Name MemberName = $null MemberUPN = $null MemberDN = $null } } } | Export-Csv -Path "AD_Group_Members.csv" -NoTypeInformation
方法3:混合环境数据合并
若部分组是本地同步至Azure AD的混合组,可以分别从本地AD和Azure AD获取数据,合并后导出,避免遗漏。
关于Get-ADGroupMember的替代方案
Get-ADGroupMember对跨域查询支持较差,且部分环境下需要域控制器权限,不适合大规模场景。替代方案:
- 用
Get-ADGroup的member属性获取成员的DN,再通过Get-ADObject解析成员信息,如方法2中的代码。 - 直接使用Azure AD/Graph API查询,如方法1,这更符合你成员实际存在于Azure AD的场景。
内容的提问来源于stack exchange,提问作者Mohsen Alam
相关产品推荐
相关产品推荐

