使用 Power Automate 和 Azure Automation 管理 SharePoint 网站的生命周期
SharePoint 蔓延是一个真正的问题
管理良好的 Microsoft 365 环境的一个关键方面是确保 SharePoint 网站(以及 Microsoft Teams)等对象在不再需要时被删除。我与许多组织交谈过,他们部署了 Microsoft 365 租户,但没有考虑如何管理网站的生命周期。最终的结果往往是后悔。虽然这个问题通常不会在最初几年出现,但随着时间的推移,租户管理员开始注意到租户中对象的激增使得日常管理变得非常困难。例如,缺乏适当治理的环境往往会在大量 SharePoint 网站上散布大量过时数据,从而导致管理员和用户感到困惑。
在本文中,我将探讨如何将相对基本的 PowerShell 和 Azure 自动化技能与 Power Automate 相结合,以创建一种干净、强大的方法来防止 Microsoft 365 租户过度扩张。
为什么组过期策略可能不适合您
微软对群组/团队扩张的解决方案是群组过期策略。在基本层面上,过期作为删除 Microsoft 365 租户中较旧或不活动组的简单方法效果很好,尽管来自 Microsoft Graph 的有限信号可能会使基于活动的过期变得不可靠。过期策略允许群组所有者批准删除群组或续订群组以防止删除,并向用户发送多个提醒以尝试确保不会错过续订。
过期策略的问题在于您的要求与 Microsoft 的组过期愿景不完全相符。例如,每个租户仅支持一个组过期策略。属于过期策略范围内的所有组都具有相同的过期期限。另一个例子是当您不想将组包含在过期策略中时。过期策略有两种分配设置:所有组或选定的组(最多 500 个)。此外,组过期策略(从名称可以看出)专门关注组连接的团队网站,不涵盖任何其他 SharePoint Online 网站,例如通信网站。组过期策略还需要 Entra ID Premium 许可,这对某些组织来说可能是一个障碍。
虽然过期策略在某些情况下很有用,但缺乏控制组过期的灵活性和自定义性通常会说服租户探索某种形式的自定义解决方案。
结合 Azure 自动化和 Power Automate
有关 Practical 365 的大量文章展示了 Azure 自动化在需要自动化管理操作时的价值。例如,我之前写过类似的主题,即通过自动化保持团队整洁。对于可重复的编程任务,Azure 自动化对于任何租户管理员来说都是一个出色的工具,可以放入其工具箱中。 Azure 自动化可以为此解决方案完成大部分繁重工作,但它无法提供的一件事(由于 Azure 自动化在托管 Linux 机器上运行简单脚本的性质)是对象删除的批准流程。
这就是 Power Automate 的用武之地。具体来说,Power Automate 中的审批功能是创建用户友好的审批流程的简单方法。用户可以在 Teams 和 Outlook 中管理批准通知,从而相对轻松地响应过期通知。
最后,需要维护要包含的站点列表及其相关的过期时间。存在多个选项来存储受过期检查限制的组列表,例如 SharePoint 或 Azure 存储中的 CSV 文件或 Dataverse 表。对于此示例,我使用 SharePoint 列表,因为它易于维护并支持基本版本历史记录和审核日志记录。一切就绪后,流程将遵循图 1 中的轮廓。
SharePoint 跟踪列表
为了跟踪审批状态,我使用 SharePoint 列表来保存管理网站过期所需的关键详细信息。该列表包含表 1 中所示的列。
- Column Name
详细信息
- SiteName
人员字段用于为每个站点定义一个或多个审批者
- SiteURL
网站的网址
- RetentionDays
网站的有效期(以天为单位)
- RemainingDays
用于跟踪距离到期还剩多少天
- MarkedforDeletion
-
用于跟踪是否应删除网站的选择字段。可用的选项有:“是”、“否”和“待批准”
- DeletedOn
用于跟踪网站被删除的日期
- Approver
用于为每个站点定义一个或多个审批者的人员字段
跟踪列表(图 2)包含过期过程范围内每个站点的详细信息和当前状态。如果某个站点不在列表中,则该站点不会过期。
创建跟踪列表时,请确保对“Deletedon”、“MarkedforDeletion”和“SiteURL”列建立索引,以便可以从 Graph API 请求中搜索它们。该列表的索引设置如图 3 所示。
电源自动化流程
Power Automate 非常灵活,并且可以自定义流程审批流程以满足组织要求。我不会在这里深入研究创建 Power Automate 流的底层细节,但如果您不熟悉 Power Automate,我建议您阅读 Teams 和 Power Automate:自动化任务的实际示例。
到期过程的 Power Automate 流程以每天运行一次的计划触发器开始。每天,流程都会检查跟踪列表,如果“RemainingDays”值尚未为 0,则该值会减少。触发流程如图 4 所示。
如果“RemainingDays”值已为 0,则该站点已过期,并且将运行审批流程。 “MarkedForDeletion”列将更新为值“PendingApproval”,并且批准会发送给“批准者”列中列出的用户。流程的配置如图 5 所示。
然后,批准将通过 Teams 和 Outlook 发送到批准者列表。批准者可以选择批准删除或拒绝并再次重置组的生命周期(图 6)。
最后,如果其中一位批准者批准该请求,流程会将“MarkedforDeletion”字段更新为“Yes”。如果他们拒绝请求,流程将重置“RemainingDays”以匹配“RetentionDays”值,并重新启动过期时间(图 7)。
Azure 自动化运行手册
自动化帐户和运行手册是解决方案所需的最后一个配置。我在本示例中使用的代码可以在 GitHub 上找到。 Runbook 使用四个 PowerShell 模块,需要将其添加为自动化帐户的资源:
- 需要 Microsoft.Graph.Authentication 来对 Microsoft Graph API 进行身份验证。
- 需要 Microsoft.Graph.Groups 来处理组连接站点的删除。
- 需要 Microsoft.Graph.Sites 来收集每个站点上的数据。
- 需要 PnP.PowerShell 来处理通信站点的删除,因为 Microsoft Graph API 尚不支持此操作。
有关安装和更新 Azure 自动化模块的更多信息,请查看本文。
自动化帐户使用系统分配的托管标识对 Microsoft Graph 和 PnP PowerShell 进行身份验证 - 类似于本文中的说明。需要分配给托管标识的服务主体的权限是:
- Microsoft Graph - Group.ReadWrite.All - 需要删除组连接的站点
- Microsoft Graph - Sites.FullControl.All - 检索站点信息和管理站点所需
- Office 365 SharePoint Online - Sites.Manage.All - 需要通过 PNP PowerShell 删除通信网站
此示例代码演示如何向 Azure 自动化帐户添加 Graph 和 SharePoint 权限。该代码首先列出所需的 Graph 权限,获取自动化帐户服务主体 ID,获取 Microsoft Graph 应用程序的服务主体,然后将权限分配给自动化帐户。然后对 Office 365 SharePoint Online 应用程序重复此过程。有关将 Azure 自动化托管标识与应用程序的 RBAC 结合使用的文章进一步详细介绍了此过程。
##List Required Permissions
$Permissions = @(
"Group.ReadWrite.All"
"Sites.FullControl.All"
)
##Add Managed Identity ID
$MIID = "<Replace with Managed Identity Service Principal ID>"”
##Get Roles for Permissions
$GraphApp = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0000-c000-000000000000'" # Microsoft Graph
[array]$Roles = $GraphApp.AppRoles | Where-Object {$Permissions -contains $_.Value}
##Loop through and add each role
foreach($role in $roles){
$AppRoleAssignment = @{
"PrincipalId” = $MIID
"ResourceId" = $GraphApp.Id
"AppRoleId" = $Role.Id
}
# Assign the Graph permission
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $MIID -BodyParameter $AppRoleAssignment
}
##List Required Permissions
$Permissions = @(
"Sites.Manage.All"
)
##Get Roles for Permissions
$SPApp = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0ff1-ce00-000000000000'" # SharePoint Online
[array]$Roles = $SPApp.AppRoles | Where-Object {$Permissions -contains $_.Value}
##Loop through and add each role
foreach($role in $roles){
$AppRoleAssignment = @{
"PrincipalId" = $MIID
"ResourceId" = $SPApp.Id
"AppRoleId" = $Role.Id
}
# Assign the SharePoint permission
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $MIID -BodyParameter $AppRoleAssignment
}当脚本运行时,它会检测标记为删除的列表项并处理关联站点的删除。一旦对象被处理为删除,删除日期就会添加到跟踪列表中的“DeletedOn”字段中。如果没有标记为删除的对象,则脚本退出。
灵活的解决方案
在本文中,我概述了使用 Power Automate 和 Azure Automation 解决实际问题的一种方法。还可以做很多事情来改进这个过程,例如,将网站上最近的活动视为过期指标会很好。我还在这里添加了最少的错误处理,以保持事情相对正确。
正如我在此处所示,将 Microsoft 工具组合在一起可以帮助租户管理员通过相对简单的自动化流程完成一些极其复杂的任务。将来,Microsoft 可能会提供更好的解决方案来管理网站和 Teams 的过期。在此之前,管理员始终可以构建自己的解决方案并与社区共享。






