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

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

关键优化说明

  1. 直接使用循环中的$Group对象,避免重复查询群组,提升脚本效率
  2. 将$users数组初始化移至循环外部,确保所有群组的成员数据都被累积存储
  3. 增加成员类型过滤,跳过非用户类型的成员(如嵌套群组),避免无效的Get-MgUser调用报错
  4. 使用[PSCustomObject]替代New-Object PSObject,语法更简洁且性能更优
  5. 修正DisplayName的拼写错误,保证群组名称正确输出

内容的提问来源于stack exchange,提问作者LH1959

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:30:22