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

[玩转系统] 使用图表查找无成员组和无所有者组

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

使用图表查找无成员组和无所有者组


寻找寻找无会员团体的最佳方式

出现了如何使用 Graph API 查找没有成员的群组的问题。这是一个常见问题,尤其是在大型 Microsoft 365 租户中,随着时间的推移,由于人员离开公司或角色调动,组成员身份逐渐减少。 Microsoft 的无所有者组策略是解决定位因相同原因而没有所有者的组问题的一种方法,但它仅处理 Microsoft 365 组,并且不检查零成员身份。需要一个答案来处理 Microsoft 365 支持的所有组类型。

Microsoft Graph PowerShell SDK 开发团队的 GitHub 存储库中的讨论(始终是查找有关 Graph 花絮的好地方)提供了解决该问题的各种方法。这里和其他地方引用的方法通常会获取所有组并应用客户端过滤器来查找无成员组。

尽管图定义的组资源类型支持所有者和成员的集合,但必须扩展这些结构以显示所有者或成员。 List Groups Graph API 无法在单个操作中筛选和扩展所有者或成员集合以查找无成员或无所有者组。因此,我见过的大多数建议的解决方案都是通过获取组集并使用客户端过滤器或 ForEach-Object 循环来检查每个组的成员资格来工作的。

无会员团体的 Exchange 解决方案

Exchange Online 管理模块中的 Get-UnifiedGroup cmdlet 有两个隐藏的组计算属性来保存成员资格计数。这些属性与组对象一起存储在 EXODS(Exchange Online Directory Store)中,而不是 Entra ID。一个属性保存成员数量,另一个属性保存外部(来宾)成员数量。

例如,要查找成员计数为零的 Microsoft 365 组,请运行:

Get-UnifiedGroup -Filter {GroupMemberCount -eq 0}

该过滤器在服务器端运行,因此相当有效。但是,Get-UnifiedGroup cmdlet 仅处理 Microsoft 365 组。通讯组列表、安全组和启用邮件的安全组将被忽略。

图解决方案

Microsoft Graph PowerShell SDK 中的 Get-MgGroup cmdlet 可处理除动态通讯组列表之外的所有类型的 Microsoft 365 组。 Exchange Online 不会将动态通讯组列表同步到 Entra ID,因此这些对象对图形 API 不可见。

这种获取和过滤解决方案的变体使用 Get-MgGroup cmdlet 来获取所有组,并在图形检索对象时扩展成员集合。当图表获取对象时,只能处理单个可扩展属性,因此您可以同时查找无成员组或无所有者组。

为了证明这个概念并最大限度地减少获取的数据量,只需要两个属性 - 成员和组标识符。获取组后,客户端过滤器会查找成员资格为零的集合。将页面大小增加到 999(最大值)可以最大限度地减少获取完整集所需的事务数。

Write-Host "Checking for groups with no members..."
[array]$NoMembers = Get-MgGroup -All -PageSize 999 -ExpandProperty "members(`$select=id)" -Property Members, Id | Select-Object Members, Id | Where-Object {($_.Members.count) -eq 0}

$NoMembers
 
Members Id
------- --
{}      0335947a-60ce-4f46-a7e0-47531da381c4
{}      0644e3ba-a489-471f-aadd-3bd29a0f3391
{}      07ef82f5-6fd6-4a20-a47d-6c7249579255
{}      0a022083-29b3-46f7-aa61-6e830e88d167

针对 List Groups Graph API 发出的相同请求如下所示:

$uri = "https://graph.microsoft.com/v1.0/groups?`$expand=members(`$select=id)&`$select=id" 
[array]$data = Invoke-MgGraphRequest -Method get -Uri $Uri
[array]$NoMembers = $Data.Value | Where-Object {$_.Members.count -eq 0}

由于图表限制了请求检索的对象数量,因此您必须分页才能检索完整的结果集。为 Get-MgGroup cmdlet 指定 All 参数可处理 cmdlet 的分页。

该解决方案的工作原理是找到一组无成员组。当我第一次在租户中运行代码时,我惊讶地发现有这么多无主组。显然我的房客的家政服务达不到标准。

创建报告无成员组的脚本

一组组标识符对于租户管理员来说没有任何好处。更成熟的解决方案创建无成员组的报告,其中包含调查组所需的详细信息。因此我写了一个脚本:

  • 获取有关每个组的更多信息,例如显示名称、安全启用标志、创建日期等。
  • 对于每个组,检查其类型。如果该组不是 Microsoft 365 组并且启用了邮件,则它可能是通讯组列表,因此脚本会检查这是否属实。
  • 生成报告(图 1)并将数据输出为 CSV 文件。
  • 对无所有者组执行相同的操作(技术相同,并检查所有者属性而不是成员)。

[玩转系统] 使用图表查找无成员组和无所有者组

您可以从 GitHub 下载完整的脚本。

关于性能的一句话

获取并分析大型租户中的每个组并不是一个快速的操作。如果您面临处理数万个组的任务,我会将处理分成多个批次,也许可以使用组显示名称的第一个字母来创建 26 个批次。 PowerShell 7 中引入的并行处理功能也可能有所帮助。

寻找无主或无成员的团体并不是一项日常任务。考虑将作业作为 Azure 自动化计划 Runbook 运行,将输出文件上传到 SharePoint Online 网站或通过电子邮件将文件作为附件发送给管理员。每月一次应该足以控制这些问题群体。

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

取消回复欢迎 发表评论:

关灯