MSOnline脚本迁移至MS Graph API的多租户用户查询问题
合作伙伴通过MS Graph API跨租户拉取客户用户数据方案
核心思路
作为CSP合作伙伴,无需为每个客户租户单独创建应用,只需在自己的合作伙伴租户中配置好租户范围的应用权限,就能通过MS Graph API直接访问所有关联客户租户的资源,完全匹配原MSOnline脚本的跨租户操作逻辑。
步骤实现
配置应用权限(关键)
- 在合作伙伴租户的应用注册中,添加
User.Read.All应用权限(注意选应用权限,不是委派权限)。 - 完成管理员同意:在应用注册的「API权限」页面点击「授予管理员同意」,该同意会自动覆盖所有关联的客户租户,无需客户单独操作。
- 在合作伙伴租户的应用注册中,添加
获取客户租户ID
调用Graph API获取所有客户合约,提取每个合约中的customerId字段作为客户租户ID,对应原Get-MsolPartnerContract的功能:GET https://graph.microsoft.com/v1.0/contracts用Microsoft Graph PowerShell模块实现:
$contracts = Get-MgContract -All拉取客户租户的用户数据
针对每个客户租户ID,有两种方式访问其用户资源:- 方式一:通用Graph端点+租户ID路径参数
GET https://graph.microsoft.com/v1.0/tenants/{customerId}/users - 方式二:租户专属Graph端点
GET https://{customerId}.graph.microsoft.com/v1.0/users
用Microsoft Graph PowerShell模块的简化实现(推荐):
# 以应用身份登录合作伙伴租户(示例用证书认证,也可使用ClientSecret) Connect-MgGraph -ClientId "你的应用ID" -TenantId "合作伙伴租户ID" -CertificateThumbprint "证书指纹" # 遍历所有客户租户拉取用户 foreach ($contract in $contracts) { $customerTenantId = $contract.CustomerId $users = Get-MgUser -TenantId $customerTenantId -All # 按需处理用户数据,比如导出到CSV $users | Select-Object Id, DisplayName, UserPrincipalName | Export-Csv -Path ".\用户_$customerTenantId.csv" -NoTypeInformation }- 方式一:通用Graph端点+租户ID路径参数
注意事项
- 必须使用应用权限:委派权限需要用户交互,且跨租户使用时需每个客户租户管理员单独授权,不符合无人值守脚本的需求。
- 权限范围匹配:如果需要除读取用户外的其他操作,可添加对应应用权限(如
User.ReadWrite.All)。 - 令牌有效性:发起请求的令牌必须来自合作伙伴租户的应用,且令牌中包含已授予的应用权限,否则会返回权限不足错误。
内容的提问来源于stack exchange,提问作者Manoj Rai
相关产品推荐
相关产品推荐

