自动清除 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>
。
所以我的问题是:
- 关于共享点模块和存储的信用,我是对还是错? (IE,因此可以通过服务主体或服务帐户从 Azure Automation 使用该模块)
- 我对 PnP 模块的看法是对还是错,它缺少类似的
Remove-SPOUserProfile
?
- 使用 REST API,您如何搜索配置文件,尤其是“导入时丢失”的配置文件?
- 有什么方法可以预测给定用户的
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 租户并授予权限
使用管理员帐户访问 https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps。点击“新注册”并为您的应用创建一个名称。
转到“API 权限”并单击“添加权限”按钮并授予 SharePoint API 权限。
Select 需要权限。
管理员需要同意这些权限,之后状态栏会显示绿色。
第 2 步:创建自签名证书并与应用程序连接
转到这个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”.
运行 下面使用 PowerShell 命令。系统会要求您提供密码来加密您的私钥,.PFX 文件和.CER 文件都将导出到当前文件夹。
.\Create-SelfSignedCertificate.ps1 -CommonName "YourCompanyName"
-StartDate 2020-1-09 -EndDate 2022-10-01
- 转到 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)
作为清理任务的一部分,我正在寻找以编程方式从 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>
。
所以我的问题是:
- 关于共享点模块和存储的信用,我是对还是错? (IE,因此可以通过服务主体或服务帐户从 Azure Automation 使用该模块)
- 我对 PnP 模块的看法是对还是错,它缺少类似的
Remove-SPOUserProfile
? - 使用 REST API,您如何搜索配置文件,尤其是“导入时丢失”的配置文件?
- 有什么方法可以预测给定用户的
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 租户并授予权限
使用管理员帐户访问 https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps。点击“新注册”并为您的应用创建一个名称。
转到“API 权限”并单击“添加权限”按钮并授予 SharePoint API 权限。
Select 需要权限。
管理员需要同意这些权限,之后状态栏会显示绿色。
第 2 步:创建自签名证书并与应用程序连接
转到这个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”.
运行 下面使用 PowerShell 命令。系统会要求您提供密码来加密您的私钥,.PFX 文件和.CER 文件都将导出到当前文件夹。
.\Create-SelfSignedCertificate.ps1 -CommonName "YourCompanyName" -StartDate 2020-1-09 -EndDate 2022-10-01
- 转到 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)