You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:27:42