自动清除 SPO 用户配置文件的方法

Automated way to purge SPO User Profiles

作为清理任务的一部分,我正在寻找以编程方式从 Sharepoint Online 的用户配置文件管理器中清除已删除的 AAD 帐户的方法。

我使用 Sharepoint Powershell 模块 (Microsoft.Online.SharePoint.PowerShell) 手动执行此操作,使用 Remove-SPOUserProfile commandlet,如果我在交互式会话中使用它,它工作得很好。但是,当我尝试将我的脚本实施到 Azure Automation 中时,我发现当在 Connect-SPOService 语句中使用 PSCredential 对象时,特定模块会回退到基本身份验证。 Basic Auth 在我的组织中被阻止(我看不到他们只允许我这样做!)

我找到了 PnP 模块 (PnP.PowerShell),它允许通过存储的凭据进行身份验证。但它没有等效的用户配置文件删除 cmdlet。

最后,我尝试求助于纯 REST API,虽然我可以获得现有的用户配置文件,但我无法获取已删除帐户的配置文件(标记为 'Profiles Missing from Import' 在 SPO ProfMngr.aspx 页面中)。这是因为 SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v) API 需要完全匹配(例如 i:0#.f|membership|vardhaman@siteurl.onmicrosoft.com),并且当删除 AAD 帐户时,配置文件用户名会附加 DELETED-<GUID>

所以我的问题是:

  1. 关于共享点模块和存储的信用,我是对还是错? (IE,因此可以通过服务主体或服务帐户从 Azure Automation 使用该模块)
  2. 我对 PnP 模块的看法是对还是错,它缺少类似的 Remove-SPOUserProfile
  3. 使用 REST API,您如何搜索配置文件,尤其是“导入时丢失”的配置文件?
  4. 有什么方法可以预测给定用户的 DELETED-<GUID> 是什么?因为如果我查找完整的已删除名称并将其提供给我的 REST 调用,我就可以获得用户配置文件。

关于此的官方文档很简单 - 不再开发旧的传统共享点 APIs,支持 MS Graph,但 Graph 文档似乎没有涵盖我的特定用途案例.

感谢任何指点

更新 1

谢谢@Michael Han_MSFT。

我使用的是 pre-release/nightly 版本 (0.3.32),但在查看发布文档时没有意识到其中包含删除配置文件。

不过我仍然遇到问题:

Connect-PnPOnline `
-url "https://<tenantname>.sharepoint.com" `
-ClientId $ClientId `
-ClientSecret $ClientSecret

# $guest1 = Guest account's email address

$azureEmail = ($guest1 -replace "@", "_") + "#ext#@<tenantname>.onmicrosoft.com"

Remove-PnPUserProfile `
-LoginName $azureEmail


Remove-PnPUserProfile : The remote server returned an error: (401) Unauthorized.
At line:11 char:1
+ Remove-PnPUserProfile `
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Remove-PnPUserProfile], WebException
    + FullyQualifiedErrorId : System.Net.WebException,PnP.PowerShell.Commands.UserProfiles.RemoveUserProf
   ile

所以我调整了 URL:

Connect-PnPOnline `
-url "https://<tenantname>-admin.sharepoint.com" `
-ClientId $ClientId `
-ClientSecret $ClientSecret

$azureEmail = ($guest1 -replace "@", "_") + "#ext#@azurediagovt.onmicrosoft.com"

Remove-PnPUserProfile `
-LoginName $azureEmail

Remove-PnPUserProfile : 
At line:11 char:1
+ Remove-PnPUserProfile `
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (:) [Remove-PnPUserProfile], HttpRequestException
    + FullyQualifiedErrorId : EXCEPTION,PnP.PowerShell.Commands.UserProfiles.RemoveUserProfile

所以你可以看到如果我去 <tenantname> 我得到一个 401,但是如果我去 <tenantname>-name 响应只是空白。

我确定我已经为我的应用程序授予了正确的权限(有什么方法可以查看已分配的权限吗?

在 AppInv.aspx 我认为有这个权限代码(我关注了几个博客):

<AppPermissionRequests AllowAppOnlyPolicy="true">
 <AppPermissionRequest Scope="http://sharepoint/content/Tenant" Right="FullControl"/>
 <AppPermissionRequest Scope="http://sharepoint/social/Tenant" Right="FullControl"/>
</AppPermissionRequests>

作为进一步测试,我尝试了我在 REST 中所做的 PnP 版本 (Get-PnpUserProfileProperty) 并获得了

Get-PnPUserProfileProperty : Current user is not a tenant administrator.
At line:1 char:1
+ Get-PnPUserProfileProperty -Connection $pnpctx -Account "scottdu@data ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (:) [Get-PnPUserProfileProperty], ServerException
    + FullyQualifiedErrorId : EXCEPTION,PnP.PowerShell.Commands.UserProfiles.GetUserProfileProperty

这很奇怪,因为 REST 会给我一个 results.d 响应。

在这个阶段,我可以考虑让 App Id 成为 Sharepoint 服务管理员(我已经批准允许 Azure Automation 拥有解决此问题所需的任何权利)。

更新 1a: 没有区别,除非在分配角色和权限生效之间存在延迟)。

您可以尝试以下命令:Remove-PnPUserProfile

https://pnp.github.io/powershell/cmdlets/Remove-PnPUserProfile.html

您应该安装 PnP.PowerShell 的预发布版本: https://www.powershellgallery.com/packages/PnP.PowerShell/0.3.8-nightly

更新:

您可以尝试使用租户管理员帐户连接 Sharepoint 管理站点,然后 运行 命令 Remove-PnPUserProfile。这对我有用:

AAD 注册应用可用于连接 PnpOnline 和删除用户配置文件。请参阅我的以下步骤: (主要参考文章:https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/security-apponly-azuread

第 1 步:在 Azure Active Directory 租户中注册一个 Azure AD 应用程序linked 到您的 Office 365 租户并授予权限

  1. 使用管理员帐户访问 https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps。点击“新注册”并为您的应用创建一个名称。

  2. 转到“API 权限”并单击“添加权限”按钮并授予 SharePoint API 权限。

  3. Select 需要权限。

  4. 管理员需要同意这些权限,之后状态栏会显示绿色。

第 2 步:创建自签名证书并与应用程序连接

  1. 转到这个link(https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/security-apponly-azuread#setting-up-an-azure-ad-app-for-app -only-access),复制脚本并保存为“Create-SelfSignedCertificate.ps1”.

  2. 运行 下面使用 PowerShell 命令。系统会要求您提供密码来加密您的私钥,.PFX 文件和.CER 文件都将导出到当前文件夹。

.\Create-SelfSignedCertificate.ps1 -CommonName "YourCompanyName" -StartDate 2020-1-09 -EndDate 2022-10-01

  1. 转到 AAD 应用程序,‖在左侧菜单栏中单击“证书和机密”。单击“上传证书”按钮,select 您生成的 .CER 文件并上传。

第三步:在线连接pnp并执行删除配置文件

$ Connect-PnPOnline -ClientId <$application client id as copied over from the AAD app registration above> -CertificatePath '<$path to the PFX file generated by the PowerShell script above>' -CertificatePassword (ConvertTo-SecureString -AsPlainText "<$password assigned to the generated certificate pair above>" -Force) -Url https://<$yourtenant>.sharepoint.com -Tenant "<$tenantname>.onmicrosoft.com" $Remove-PnPUserProfile -LoginName $UPN

对于 REST api 方式,我发现这篇文章指出用于删除用户配置文件的 REST 未实现。 (https://docs.microsoft.com/en-us/sharepoint/dev/general-development/work-with-user-profiles-in-sharepoint)