当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何查找具有来宾成员的 Microsoft 365 组

作者:精品下载站 日期:2024-12-14 04:06:28 浏览:12 分类:玩电脑

如何查找具有来宾成员的 Microsoft 365 组


有多种方法可以查找包含访客成员的团体

尽管我很喜欢 Graph API,但有时它们并不是工作的正确选择。以一位读者为例,他想要查找租户中具有来宾成员的所有 Microsoft 365 组。他们希望使用 Graph API 根据成员身份过滤组,但发现这是不可能的。相反,完成这项工作所需的代码类型是:

  • 查找所有访客帐户。
  • 对于每个访客帐户,找到他们所属的组。
  • 报告有客人的团体。

这听起来很简单。唯一的问题是需要时间询问 Azure AD 来查找每个来宾帐户的组集,然后调用 Get-MgGroup 来检索显示名称,因为 Get-MgUserMemberGroup 仅返回一组组标识符而不是完整的组详细信息。无论如何,这就是我的想法:

[array]$GuestAccounts = Get-MgUser -All -Filter "UserType eq 'Guest'" | Select -ExpandProperty Id
[array]$AllGroups = $Null
ForEach ($Guest in $GuestAccounts) {
   [array]$Groups = Get-MgUserMemberGroup -UserId $Guest -SecurityEnabledOnly:$false 
   $AllGroups += $Groups }
$GraphGroups = $AllGroups | Sort -Unique
ForEach ($Group in $GraphGroups) { 
    $G = Get-MgGroup -GroupId $Group 
    If ($G.GroupTypes -like "*Unified*") {
       Write-Host ("Microsoft 365 Group {0} found" -f $G.DisplayName) }
}

缓慢但有效的代码

该代码可以工作,但速度很慢。在拥有 170 个来宾帐户和 217 个 Microsoft 365 组的租户中,代码仅用了 10 多秒就找到了 12 个包含来宾成员的组。对于一次性脚本来说这没问题,但我们可以在性能和功能方面做得更好。

迫在眉睫的问题是 Microsoft Graph PowerShell SDK cmdlet 缺乏可用于查找访客组的筛选功能。这迫使需要获取所有客人,然后找到他们所属的组。另一个复杂性是 Get-MgUserMemberGroup 返回来宾可以属于的所有类型的组。在大多数情况下,这些是 Microsoft 365 组,但您可以将来宾帐户添加到通讯组列表,因此需要进一步检查以确保我们仅处理 Microsoft 365 组。

使用 Get-UnifiedGroup 查找包含访客的组

不过,Get-UnifiedGroup cmdlet 可以使用合适的过滤器。这不是 Graph cmdlet,但它证明通常存在多种方法来解决 Microsoft 365 中的问题。事实上,使用 Get-UnifiedGroup 解决方案非常简单,因为 Exchange Online 会跟踪来宾数量在可过滤属性中的每个组中,这意味着我们可以使用服务器端过滤器来查找具有来宾成员的组集:

[array]$ExoGroups = Get-UnifiedGroup -Filter {GroupExternalMemberCount -gt 0}

该命令在两秒内运行,所以这是一个很好的改进。

检测不应有访客成员的群组

我们现在知道 Microsoft 365 组有哪些来宾成员。这是有趣的信息,但我们可以使用这些数据来检查是否有任何访客所在的组具有阻止访客访问的敏感度标签。如果管理员分配阻止来宾访问组的敏感度标签,则该敏感度标签会阻止添加新的来宾成员,但对现有来宾没有影响。这些成员继续享有对集团资源的完全访问权限。这些客人留下来的事实造成了不一致,值得进行审查,以确定标签是否不正确或应该删除客人。

要检查我们识别的组集,我们需要知道哪些敏感度标签具有禁止来宾成员的容器管理设置(以控制团队、组和站点)。为此:

  • 运行 Set-Label cmdlet 以查找所有标签。
  • 找到具有容器管理设置的集。
  • 过滤阻止访客访问的标签。

此代码完成这项工作并创建两个哈希表:一个包含一组容器管理标签,另一个包含允许来宾访问的标签。

Connect-IPPSSession
[array]$Labels = Get-Label
$ContainerLabels = @{}
$LabelsAllowingGuests = @{}
ForEach ($Label in $Labels) { # Find out which labels apply blocks to guest users
       $LabelGuestAccess = $True
       $LabelActions = $Label.LabelActions | ConvertFrom-Json      
       ForEach ($LabelAction in $LabelActions) {
          If (($LabelAction.Type -eq "protectgroup") -and ($Label.ContentType -Like "*Site*")) {
             $Settings = $LabelAction.Settings
             $ContainerLabels.Add([String]$Label.ImmutableId, $Label.DisplayName)
             ForEach ($Setting in $Settings) {
                If ($Setting.Key -eq "allowaccesstoguestusers" -and $Setting.Value -eq "true") {
                  $LabelsAllowingGuests.Add([String]$Label.ImmutableId, $Label.DisplayName)}}}
}}
Write-Host “The following labels allow guest access to Groups, Teams, and Sites”
$LabelsAllowingGuests | Format-Table Value

填充哈希表后,我们可以检查分配给每个组的敏感度标签以确保其一致。如果某个群组有不允许访客的标签,我们会标记该群组,以便管理员决定是否应留下访客或将其移除。如果决定允许来宾加入群组成员资格,则最好分配允许来宾访问的敏感度标签。

ForEach ($Group in $ExoGroups) {
   $CheckLabel = $LabelsAllowingGuests.Item($Group.SensitivityLabel.Guid)
   # Write-Host "Group" $Group.DisplayName "Label" $LabelDisplayName
   If (!($CheckLabel)) { 
        $BadLabel = $ContainerLabels.Item($Group.SensitivityLabel.Guid)
        Write-Host ("The label assigned to the {0} group doesn't allow guests ({1})" -f $Group.DisplayName, $BadLabel ) }
}

The label assigned to the Corporate Business Development group doesn't allow guests (Limited Access)
The label assigned to the Sales Department team group doesn't allow guests (Limited Access)

速度和效率

就是这样。我们找到了包含访客成员的群组,并检查了这些群组是否有适当的敏感度标签。使用服务器端筛选器查找组意味着 Get-UnifiedGroup 的性能比当前使用 Graph cmdlet 的性能要好得多。

顺便说一句,在过去的几年里,微软已经构建了一套可用于容器管理的控件。最近的一个例子是对站点外部共享功能的控制。即使您不想使用敏感度标签来保护 Office 文档(和 PDF 文件),使用标签进行容器管理也是在团队、组和站点上应用一致设置的好方法。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯