使用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
额外验证步骤
- 执行脚本前,先运行
$groupMembers | Select-Object Id, @{Name='Type'; Expression={$_.AdditionalProperties['@odata.type']}},确认成员类型是否被正确识别为#microsoft.graph.user。 - 执行
Get-MgContext检查已授权的Scopes,确保包含User.Read.All和Group.Read.All。
内容的提问来源于stack exchange,提问作者Bruce M
相关产品推荐
相关产品推荐

