如何通过本地PowerShell脚本导出Microsoft 365群组所有者及成员角色信息
如何通过本地PowerShell脚本导出Microsoft 365群组所有者及成员角色信息
我完全懂你这种陷入 deprecation 迷宫+脚本卡壳的崩溃感!折腾了10小时确实够闹心的,咱们先把核心问题解决,顺便把模块选择的困惑也捋清楚。
先给你划重点:别再纠结MSOnline和AD模块了
- ActiveDirectory模块是给本地域环境用的,和Microsoft 365的云AD完全不搭,你用它连不上365很正常,直接放弃就行。
- MSOnline模块确实已经被官方废弃了,虽然现在还能用,但随时可能停服,而且它的属性返回逻辑很坑(比如你遇到的ManagedBy为空的问题),没必要再死磕。
- 现在官方唯一长期支持的是Microsoft Graph PowerShell SDK,它就是标准的PowerShell cmdlet,不是什么复杂的.NET库,用法和你之前写的脚本逻辑差不多,只是调用的是更可靠的Graph API。
你之前脚本的问题出在哪?
- ManagedBy为空:MSOnline的
Get-MsolGroup默认返回的对象不包含ManagedBy属性,就算单独查单个组,有时候也因为权限或模块本身的问题拿不到值,而且就算拿到了,也只能知道谁是所有者,没法直接和成员列表关联标记角色。 - 无法区分成员/所有者:
GroupMemberType本来就只是用来区分用户、服务主体这类对象类型的,根本不是用来标记群组内角色的,所以你用它肯定分不出来Owner和Member。
直接给你可运行的解决方案(用Microsoft Graph PowerShell)
第一步:安装并连接Graph模块
先打开PowerShell(推荐用管理员权限,避免安装模块时的权限问题),执行以下命令:
# 安装Microsoft Graph模块(如果没装过的话) Install-Module Microsoft.Graph -Scope CurrentUser # 连接到Microsoft Graph,需要读取群组和用户的权限 Connect-MgGraph -Scopes "Group.Read.All", "User.Read.All"
如果安装时提示是否信任PSGallery仓库,输入Y确认就行;连接时会弹出浏览器让你登录你的365管理员账号,授权即可。
第二步:运行脚本获取并输出(或导出)数据
这个脚本会遍历所有分发组,分别获取每个组的所有者和成员,标记清楚角色,最后输出到控制台,也可以直接导出CSV:
# 获取所有传统分发组(和你之前的DistributionList对应,排除Office 365统一组) $groups = Get-MgGroup -Filter "groupTypes/any(c:c eq 'Unified') eq false" -All $true # 准备存储结果的数组 $results = @() foreach ($group in $groups) { Write-Host "正在处理群组: $($group.DisplayName)" # 获取当前群组的所有所有者 $owners = Get-MgGroupOwner -GroupId $group.Id -All $true | Select-Object Id, UserPrincipalName, DisplayName # 获取当前群组的所有成员 $members = Get-MgGroupMember -GroupId $group.Id -All $true | Select-Object Id, UserPrincipalName, DisplayName # 把所有者加入结果,标记角色为Owner foreach ($owner in $owners) { $results += [PSCustomObject]@{ GroupName = $group.DisplayName GroupEmail = $group.Mail GroupId = $group.Id MemberName = $owner.DisplayName MemberEmail = $owner.UserPrincipalName Role = "Owner" } } # 把成员加入结果,排除已经是所有者的用户(避免重复),标记角色为Member foreach ($member in $members) { if (-not ($owners.Id -contains $member.Id)) { $results += [PSCustomObject]@{ GroupName = $group.DisplayName GroupEmail = $group.Mail GroupId = $group.Id MemberName = $member.DisplayName MemberEmail = $member.UserPrincipalName Role = "Member" } } } } # 输出到控制台查看结果 $results | Format-Table GroupName, GroupEmail, MemberName, MemberEmail, Role -AutoSize # 如果要导出到CSV,取消下面的注释,把路径改成你想要的位置 # $results | Export-Csv -Path "C:\temp\365GroupMembersWithRoles.csv" -NoTypeInformation -Encoding UTF8
脚本说明
- 筛选分发组的逻辑是排除
Unified类型的组(也就是Office 365统一组),如果你需要包含统一组,去掉-Filter参数就行。 - 会自动排除既是所有者又是成员的用户,避免重复条目。
- 导出的CSV用UTF8编码,避免中文乱码问题。
关于IDE的小建议
PowerShell ISE虽然被标记为deprecated,但暂时还能用,不过官方现在主推Visual Studio Code加上PowerShell扩展,代码提示、调试功能都比ISE强很多,而且是长期支持的,你可以试试切换过去。
备注:内容来源于stack exchange,提问作者LWChris
相关产品推荐
相关产品推荐

