如何使用PowerShell Microsoft Graph获取多组AzureAD群组的成员
解决PowerShell Microsoft Graph获取多AzureAD群组成员的问题
原脚本核心错误
- 循环内错误赋值:
$GROUP_NAME = $GROUP_LIST将整个群组集合赋值给单个变量,导致过滤条件无效,无法正确定位群组 - 数组初始化位置错误:
$users = @()放在循环内部,每次循环都会清空数组,最终仅保留最后一个群组的成员数据 - 拼写错误:
$group.DsplayName应为$group.DisplayName(缺少字母i) - 未过滤成员类型:
Get-MgGroupMember会返回用户、群组等多种类型对象,直接对非用户成员调用Get-MgUser会触发报错
修正后的脚本
Connect-MgGraph # 初始化数组存储所有成员数据,放在循环外部 $users = @() # 获取所有Azure AD群组 $GROUP_LIST = Get-MgGroup foreach ($Group in $GROUP_LIST) { # 直接复用已获取的群组对象,无需重复调用Get-MgGroup过滤 # 获取当前群组的成员,并过滤仅保留用户类型 $members = Get-MgGroupMember -GroupId $Group.Id | Where-Object { $_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.user' } foreach ($member in $members) { $user = Get-MgUser -UserId $member.Id # 修正拼写错误,用[PSCustomObject]简化对象创建 $users += [PSCustomObject]@{ Group = $Group.DisplayName Name = $user.DisplayName UserPrincipalName = $user.UserPrincipalName Mail = $user.Mail } } } # 输出所有群组成员数据 $users | Format-Table
关键优化说明
- 直接使用循环中的
$Group对象,避免重复查询群组,提升脚本效率 - 将
$users数组初始化移至循环外部,确保所有群组的成员数据都被累积存储 - 增加成员类型过滤,跳过非用户类型的成员(如嵌套群组),避免无效的
Get-MgUser调用报错 - 使用
[PSCustomObject]替代New-Object PSObject,语法更简洁且性能更优 - 修正
DisplayName的拼写错误,保证群组名称正确输出
内容的提问来源于stack exchange,提问作者LH1959
相关产品推荐
相关产品推荐

