SharePoint Online PowerShell 新增应用专用身份验证指南

本文介绍了 SharePoint Online PowerShell 模块新增的基于证书的身份验证(应用专用身份验证)功能。文章阐述了其配置步骤、技术优势,并与 Microsoft Graph API 在自动化场景中的应用进行了对比,为管理员实现安全、无值守的自动化脚本提供了详细指导。

将应用专用身份验证用于 SharePoint Online PowerShell

我经常对微软在 SharePoint Online 管理 PowerShell 模块上投入的开发精力不足表示担忧。除了更新重要 cmdlet(如 Set-SPOTenant 或 Set-SPOSite)以添加针对租户或站点的新设置外,微软并未投入太多精力来推动该模块的发展。例如,尽管该模块可以在最新版本的 PowerShell Core 中运行(我使用 V7.5.4),但 SharePoint 仍然是一个 Windows PowerShell 模块。

随后,来自消息中心通知 MC1188595 的喜讯于 2025 年 11 月 21 日出现,宣布 SharePoint Online 模块现在支持基于证书的身份验证(CBA),即应用专用身份验证。毫无疑问,来自微软当前安全倡议的一些压力促使了某些行动,以摆脱对用户凭据的依赖。正如微软所说:

“此更新解决了在强制实施多因素身份验证(MFA)等环境中对安全、无人值守自动化的业务需求。通过此增强功能,客户可以使用应用标识运行自动化脚本,确保符合安全策略,同时保持运营效率。”

Graph API 通常是更好的自动化选择

我不确定自己是否曾经将 SharePoint Online 模块用于无人值守的自动化。在许多情况下,Graph API 是更好的选择,尤其是在使用 Azure Automation 的托管标识运行后台作业时。SharePoint 开发人员最近增加了通过“创建站点”Graph API 来创建新站点的能力。创建用于 Microsoft 365 群组和团队的站点已经可行多年,因此此次更新填补了通信站点和其他站点类型的空白。Graph API 相比 SharePoint PowerShell 模块的一个重要优势在于,API 可以处理用户数据,例如存储在文档库中的文件、SharePoint 列表和 SharePoint 页面,甚至可以报告使用情况信息。

微软于 2023 年向 Graph 添加了 SharePoint 管理 API,但此后并未对其采取任何行动。也许他们认为,更新设置等 SharePoint 管理操作主要是可以通过管理中心执行的一次性事件。

使用应用专用身份验证

但现在我们有了应用专用身份验证。所需设置的详细信息可在微软文档中找到,因此我在此不再赘述。请确保使用最新版本的 SharePoint Online 模块更新 Windows PowerShell。我使用了版本 16.0.2712.1200。

在设置应用方面,请记住,授予访问 SharePoint Online 权限的授权源是 Office 365 SharePoint Online 应用,而不是 Microsoft Graph。在向应用分配权限时,请确保从 SharePoint Online 而非 Graph 中选择 Sites.FullControl.All 权限(图 1)。

图 1:为应用专用身份验证配置来自 Office 365 SharePoint Online 的权限

之后,您可以将自签名的 X.509 证书上传到应用,并记下证书指纹。确保证书已加载到证书存储中。出于测试目的,我使用 Import-Certificate cmdlet 将证书导入到我的账户的根存储中。

一切准备就绪后,我调整了通常用于通过 PowerShell Core 连接到 SharePoint Online 的方法,以使用应用专用身份验证。该代码使用 Microsoft Graph PowerShell SDK 查找租户的默认域,创建 SharePoint 管理端点,并调用 Connect-SPOService cmdlet 进行连接(使用应用专用身份验证):

1
2
3
4
5
6
7
# Connect to SharePoint Online
[array]$Domains = (Get-MgOrganization).verifiedDomains
$DefaultDomain = $Domains | Where-Object {$_.IsDefault -eq $true}
$SPOAdminRoot = ("https://{0}-admin.sharepoint.com" -f $DefaultDomain.Name.split('.')[0])
Write-Host "Connecting to SharePoint Online..."
Import-Module Microsoft.Online.SharePoint.PowerShell -UseWindowsPowerShell
Connect-SPOService -Url $SPOAdminRoot -TenantId $TenantId -ApplicationId $AppId -CertificateThumbprint $Thumbprint

成功连接后,应用专用会话可以运行所有 SharePoint Online cmdlet,就像人类 SharePoint Online 管理员已登录进行身份验证一样。没有更多其他内容需要说明。

向前迈进了一步

在消息中心的帖子中,微软指出,“可能存在一些罕见情况,其中 API 出于安全原因需要显式的用户令牌。在这种情况下,租户管理员应使用交互式流程和管理员/用户凭据。” 我猜,很难用所有有效的参数组合测试每一个 cmdlet 来发现那些罕见情况存在的地方。祝你好运!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计