PowerShell脚本故障:无法获取Entra ID动态组成员信息
问题分析与修复方案
核心问题原因
- 权限缺失:当前连接Graph的权限
Group.Read.All仅允许读取组元数据,读取组成员需要额外的GroupMember.Read.All权限,这是导致$users为空的主要原因。 - 成员类型判断逻辑错误:Microsoft Graph PowerShell返回的用户对象,其
ODataType属性值实际为microsoft.graph.user(不带前缀#),原脚本的判断条件无法匹配到用户成员。 - 动态组成员获取限制:部分动态组的成员可能需要通过
Get-MgGroupTransitiveMember获取(包含嵌套成员),而Get-MgGroupMember仅返回直接成员。
修复后的脚本
# 连接Graph时添加成员读取权限 Connect-MgGraph -Scopes "Group.Read.All", "User.Read.All", "GroupMember.Read.All" $groups = Get-MgGroup -All $filteredGroups = $groups | Where-Object { $_.DisplayName -like "*xy*" } $output = @() $filteredGroups | ForEach-Object { $group = $_ $membershipRule = "no dynamic group" $users = @() # 处理动态组规则 if ($group.GroupTypes -contains "DynamicMembership") { $membershipRule = $group.MembershipRule } try { # 优先获取所有成员(包括嵌套),如果只需要直接成员可换回Get-MgGroupMember $members = Get-MgGroupTransitiveMember -GroupId $group.Id -All -ErrorAction Stop # 修正用户类型判断逻辑 $userMembers = $members | Where-Object { $_.ODataType -eq "microsoft.graph.user" } $users = $userMembers | ForEach-Object { $_.UserPrincipalName } } catch { $users = @("获取成员失败: $($_.Exception.Message)") } $output += [PSCustomObject]@{ DisplayName = $group.DisplayName MembershipRule = $membershipRule Users = $users -join "; " } } $outputCsv = "filtered_groups.csv" $output | Export-Csv -Path $outputCsv -NoTypeInformation -Encoding UTF8
额外优化说明
- 添加了
try/catch块处理获取成员时的异常(比如权限不足、组不存在等)。 - 导出CSV时指定
-Encoding UTF8,避免中文乱码问题。 - 若仅需直接成员,可将
Get-MgGroupTransitiveMember换回Get-MgGroupMember。
内容的提问来源于stack exchange,提问作者Ck2513
相关产品推荐
相关产品推荐

