我的公司使用 Microsoft 365。当我访问 admin.microsoft.com 时,我可以看到“团队和组 > 活动团队和组”作为导航项。
打开侧面板中的其中一个组,我可以看到“所有者”和“成员”在“成员资格”选项卡中作为不同的子列表:
我想使用 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-ADGroup
该ActiveDirectory
模块,但该模块从未请求或找到连接在线资源的方法,我唯一能找到的是一个所谓的Connect-ADServer
cmdlet,但它在我的计算机上未被识别为有效 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