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

使用Microsoft Graph的PowerShell脚本导出AD安全组成员及经理邮箱时生成空白CSV

问题分析与修复方案

可能的问题点及对应修复

1. 组对象可能返回多个结果

Get-MgGroup -Filter "displayName eq '$securityGroupName'"如果存在同名组,会返回数组,后续$group.Id会出错,导致无法正常获取成员。

修复:添加-First 1确保只获取单个目标组:

$group = Get-MgGroup -Filter "displayName eq '$securityGroupName'" -First 1

2. @odata.type判断失效

Get-MgGroupMember返回的directoryObject对象中,@odata.type属性实际存储在AdditionalProperties集合里,直接访问$member.'@odata.type'无法拿到正确值,导致所有用户成员被跳过。

修复:改用AdditionalProperties获取成员类型:

if ($member.AdditionalProperties['@odata.type'] -eq "#microsoft.graph.user")

3. Get-MgGroupMember的-Property参数无效

Get-MgGroupMember针对的是directoryObject通用类型,-Property参数无法指定userPrincipalName(该属性仅属于user类型),这部分参数可以直接移除,不影响后续逻辑。

修复:简化成员获取命令:

$groupMembers = Get-MgGroupMember -GroupId $group.Id -All

4. 优化对象收集性能(可选)

用+=拼接数组会频繁创建新数组,数据量大时效率低下,建议改用ArrayList存储结果。

修复:替换数组为ArrayList:

$userDetails = New-Object System.Collections.ArrayList
# 循环内添加对象时需抑制返回值
$null = $userDetails.Add([PSCustomObject]@{
    "UserDisplayName" = $user.DisplayName
    "UserEmail" = $user.UserPrincipalName
    "ManagerEmail" = $managerEmail
})

完整修复后的脚本

Import-Module Microsoft.Graph
Connect-MgGraph -Scopes "User.Read.All", "Group.Read.All"

$securityGroupName = "redgroup"
$csvFilePath = "C:\Users\bruce\Documents\redgroup_userlist.csv"
$group = Get-MgGroup -Filter "displayName eq '$securityGroupName'" -First 1

if ($null -eq $group) {
    Write-Host "Group '$securityGroupName' not found." -ForegroundColor Red
    exit
}

$groupMembers = Get-MgGroupMember -GroupId $group.Id -All
$userDetails = New-Object System.Collections.ArrayList

foreach ($member in $groupMembers) {
    if ($member.AdditionalProperties['@odata.type'] -eq "#microsoft.graph.user") {
        $user = Get-MgUser -UserId $member.Id -Property "displayName,userPrincipalName,manager"

        $managerEmail = $null
        if ($user.Manager) {
            $manager = Get-MgUser -UserId $user.Manager.Id -Property "userPrincipalName"
            $managerEmail = $manager.UserPrincipalName
        }

        $null = $userDetails.Add([PSCustomObject]@{
            "UserDisplayName" = $user.DisplayName
            "UserEmail" = $user.UserPrincipalName
            "ManagerEmail" = $managerEmail
        })
    }
}

$userDetails | Export-Csv -Path $csvFilePath -NoTypeInformation -Encoding UTF8

Disconnect-MgGraph

Write-Host "Red Group's manager list created at $csvFilePath" -ForegroundColor Green

额外验证步骤

  1. 执行脚本前,先运行$groupMembers | Select-Object Id, @{Name='Type'; Expression={$_.AdditionalProperties['@odata.type']}},确认成员类型是否被正确识别为#microsoft.graph.user。
  2. 执行Get-MgContext检查已授权的Scopes,确保包含User.Read.All和Group.Read.All。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:31:00