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

如何通过本地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。

你之前脚本的问题出在哪?

  1. ManagedBy为空:MSOnline的Get-MsolGroup默认返回的对象不包含ManagedBy属性,就算单独查单个组,有时候也因为权限或模块本身的问题拿不到值,而且就算拿到了,也只能知道谁是所有者,没法直接和成员列表关联标记角色。
  2. 无法区分成员/所有者: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 11:03:11