如何从本地 PowerShell 脚本导出 Microsoft 365 组所有者

如何从本地 PowerShell 脚本导出 Microsoft 365 组所有者

我的公司使用 Microsoft 365。当我访问 admin.microsoft.com 时,我可以看到“团队和组 > 活动团队和组”作为导航项。

打开侧面板中的其中一个组,我可以看到“所有者”和“成员”在“成员资格”选项卡中作为不同的子列表:

Microsoft 365 管理中心中组的“所有者”列表

Microsoft 365 管理中心中组的“成员”列表

我想使用 PowerShell 脚本从本地 PC 检索所有组的成员列表以及每个成员是否是所有者的信息。最终,我想将其导出到 CSV,但现在我只是将其打印到主机。这是我最近的尝试:

Connect-MsolService
$Groups = Get-MsolGroup -GroupType DistributionList
foreach ($Group in $Groups) {
    $GroupName = $Group.DisplayName
    $Address = $Group.EmailAddress
    $GroupId = $Group.ObjectId
    $Group2 = Get-MsolGroup -ObjectId $GroupId
    $ManagedBy = $Group2.ManagedBy
    $GroupMembers = Get-MsolGroupMember -GroupObjectId $GroupId
    $Fields = $GroupName, $Address, $GroupId, $ManagedBy.EmailAddress + $GroupMembers.EmailAddress
    $Content = $Fields -join ','
    $Content
}

这给我的结果是这样的(请注意,应该是$ManagedBy.EmailAddress空的第四列):

Foo,[email protected],085d1225-a545-e497-b37b-c6496da4fedd,,[email protected],[email protected],[email protected],[email protected],[email protected],[email protected]

在到达这里之前,我对原始草稿做了几处修改:

首先,我尝试使用它$GroupMembers.GroupMemberType来区分“所有者”和“成员”,但此属性的可能值是“用户,ServicePrincipal,联系人或组”,因此它User对于成员和所有者都是一样的,显然不是如何做到这一点。

接下来,我尝试访问$Group.ManagedBy,希望至少识别首先,业主对此表示了感谢。但该房产却空置着。一些 Microsoft 社区中心帖子建议这样做是因为ManagedBy只有当请求针对单个对象时才会填充,因此$Group2查询和脚本的当前形式。然而,$ManagedBy变量仍然总是对于所有组,为空。

那么,我如何才能访问某个成员是否是所有者的信息(在线管理门户显然可以访问这些信息?)


附加信息:

启用 RSAT 后,我也尝试使用Get-ADGroupActiveDirectory模块,但该模块从未请求或找到连接在线资源的方法,我唯一能找到的是一个所谓的Connect-ADServercmdlet,但它在我的计算机上未被识别为有效 cmdlet(Get-ADGroup虽然是)。不确定所有这些是否仅适用于 AD 服务器或云外壳。

让我的情况更加复杂的是,根据Microsoft Learn 文档MSOnline它已被弃用,因此建议“Azure AD Graph“(不确定这是否与ActiveDirectory模块相同),根据其本身而言已经弃用,因此指的是另一件事,即Microsoft Graph PowerShell SDK,它实际上看起来不像 cmdlet,而更像 .NET 库(但我可能错了)。

它也无济于事,因为它PowerShell ISE也被弃用了,而且所有内容都是过时的信息,弃用说明链接到同样被弃用的替代项,一团糟。我完全糊涂了,甚至不知道使用固定脚本是否Get-MsolGroup能工作超过 3 个月。

因此,我从“如何获得成员角色”开始我的探索,现在已经陷入了 10 个小时的困境,最终得到“我可以在哪个 IDE 中使用哪个模块,而这个模块几个月后还不会被弃用?”

答案1

我会在我的机器上安装 vscode,并使用 graph 模块。要获取所有者,您可以这样做,至于如何获取成员,我让您自己弄清楚

# Install and import the Microsoft Graph PowerShell module
Install-Module -Name Microsoft.Graph -Force -AllowClobber
Import-Module Microsoft.Graph

# Authenticate to Microsoft Graph (you will be prompted to sign in)
Connect-MgGraph

# Get all Microsoft 365 groups
$groups = Get-MgGroup -Top 500 # You can adjust 'Top' based on your needs

# Iterate through each group and display owners
foreach ($group in $groups) {
    $groupId = $group.Id
    $owners = Get-MgGroupOwner -GroupId $groupId
    Write-Host "Owners of group '$($group.DisplayName)': $($owners.UserPrincipalName -join ', ')"
}

# Disconnect from Microsoft Graph
Disconnect-MgGraph

答案2

您是否尝试过使用 Microsoft Teams 模块

# Install the required module if not already installed
Install-Module -Name MicrosoftTeams -Force -AllowClobber

# Connect to Microsoft 365
Connect-MicrosoftTeams

# Get all Microsoft 365 groups
$groups = Get-Team

# Loop through each group
foreach ($group in $groups) {
    # Get group details
    $groupDetails = Get-TeamUser -GroupId $group.GroupId

    # Output group name
    Write-Host "Group: $($groupDetails.DisplayName)"

    # Loop through group members
    foreach ($member in $groupDetails) {
        $isOwner = if ($member.Role -eq "Owner") { "Owner" } else { "Member" }
        Write-Host "  Member: $($member.User.DisplayName), Role: $isOwner"
    }

    # Add a separator for better readability
    Write-Host "-----------------------"
}

# Disconnect from Microsoft 365
Disconnect-MicrosoftTeams
 

相关内容