如何定期清理已在主租户删除的Azure AD B2B来宾用户?
Azure AD B2B来宾用户定期清理方案
我们的Azure AD中有多个客户团队及大量B2B来宾用户,近期发现用户在其主租户被删除后,仍会留存于我们的AD中。除了基于非活跃时长删除外,希望通过以下逻辑实现定期清理:
For each user in guest users if removed from home tenant delete user
推测来宾用户在租户中存在相关标记,求通过Graph或PowerShell实现的可行方案?
核心判断依据
当B2B来宾用户在主租户被删除后,当前租户中的该用户会被自动标记为externalUserState = "Disabled",同时externalUserStateChangeDateTime会记录状态变更的时间。我们可以基于这个属性筛选出需要清理的目标用户。
一、Graph API实现方案
1. 查询待清理的来宾用户
调用Graph API的用户查询接口,精准筛选状态为Disabled的来宾用户:
GET https://graph.microsoft.com/v1.0/users?$filter=userType eq 'Guest' and externalUserState eq 'Disabled'&$select=id,userPrincipalName,displayName,externalUserStateChangeDateTime
2. 删除目标用户
对查询到的每个用户,调用删除接口完成清理:
DELETE https://graph.microsoft.com/v1.0/users/{user-id}
3. 定期执行
可以通过Azure Logic Apps或Azure Functions设置定时触发(比如每周一次),自动执行查询和删除流程。
二、PowerShell实现方案
1. 准备环境并连接Graph
# 安装Microsoft Graph用户模块(首次执行) Install-Module -Name Microsoft.Graph.Users -Force -AllowClobber # 连接Graph,需申请User.Read.All和User.Delete.All权限 Connect-MgGraph -Scopes "User.Read.All", "User.Delete.All"
2. 查询待清理的来宾用户
# 获取所有状态为Disabled的来宾用户,返回关键信息 $disabledGuests = Get-MgUser -Filter "userType eq 'Guest' and externalUserState eq 'Disabled'" -Select Id, UserPrincipalName, DisplayName, ExternalUserStateChangeDateTime
3. 批量删除用户
# 遍历输出待删除用户(确认无误后再取消删除命令的注释) foreach ($guest in $disabledGuests) { Write-Host "待删除来宾用户: $($guest.DisplayName) ($($guest.UserPrincipalName))" # 执行删除(取消注释启用) # Remove-MgUser -UserId $guest.Id -Confirm:$false }
4. 定期执行
可以通过Windows任务计划程序或Azure Automation Runbook设置定时任务,自动运行该脚本。
注意事项
- 删除操作需要
User.Delete.All权限,建议使用专用服务账号执行,避免使用全局管理员权限。 - 建议先执行查询命令确认目标用户列表,再执行删除操作,防止误删。
- 可以结合
externalUserStateChangeDateTime设置延迟删除(比如状态变更超过30天再清理),避免误删临时禁用的用户。
内容的提问来源于stack exchange,提问作者vilmarci
相关产品推荐
相关产品推荐

