PowerShell脚本获取EntraID用户组成员所属组无输出求助
解决Entra ID脚本中Groups列无内容的问题
问题原因分析
原脚本的核心问题有两个:
Get-MgUserMemberOf返回的对象默认是 DirectoryObject 类型,直接用-is [Microsoft.Graph.PowerShell.Models.MicrosoftGraphGroup]判断类型会失效,因为实际返回的对象并没有直接映射到这个具体类型。Get-MgGroupMember可能返回组、用户等多种类型的成员,没有过滤的话会导致非用户对象进入循环,引发不必要的错误或空值。
修正后的脚本
Connect-MgGraph -Scopes "Group.Read.All", "User.Read.All" $groupId = "你的目标组ID" # 只过滤出用户类型的组成员 $groupMembers = Get-MgGroupMember -GroupId $groupId -All | Where-Object {$_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.user'} $userGroups = @() foreach ($member in $groupMembers) { $userId = $member.Id $user = Get-MgUser -UserId $userId -Property DisplayName, UserPrincipalName # 获取用户所属的所有组,过滤并提取组名称 $userGroupMemberships = Get-MgUserMemberOf -UserId $userId -All | Where-Object {$_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.group'} | ForEach-Object { $_.AdditionalProperties.displayName } $userGroups += [PSCustomObject]@{ UserPrincipalName = $user.UserPrincipalName DisplayName = $user.DisplayName Groups = $userGroupMemberships -join ', ' # 将多个组用逗号分隔显示 } } $userGroups | Format-Table -AutoSize
关键修改说明
- 过滤组成员类型:通过
@odata.type判断只保留用户成员,避免处理组或其他对象。 - 准确识别组对象:同样用
@odata.type判断Get-MgUserMemberOf返回的结果是否为组,确保只提取组的名称。 - 优化属性获取:
Get-MgUser指定需要的属性,减少不必要的数据请求;将多个组名称用逗号拼接,在表格中更易读。 - 容错处理:如果用户没有所属组,
Groups列会显示为空,不会报错。
内容的提问来源于stack exchange,提问作者Ck2513
相关产品推荐
相关产品推荐

