Get-AzureADServiceAppRoleAssignment无法返回其他租户应用对应的服务主体角色分配,如何获取所有服务主体对目标应用注册的全部角色分配?
解决方案:获取所有跨租户服务主体对应用的角色分配
这个问题的核心在于,默认的Get-AzureADServiceAppRoleAssignment cmdlet 只会返回同一租户内主体的角色分配记录,而来宾服务主体(来自租户B)属于外部身份,不会被默认包含在结果里。下面是两种可行的解决方法:
方法一:使用Microsoft Graph API(推荐)
Graph API的查询能力更灵活,能直接返回所有包括跨租户来宾在内的角色分配记录。你可以调用servicePrincipals/{your-app-sp-id}/appRoleAssignedTo端点,它会返回所有被分配了你应用角色的主体(含本租户及来宾SP)。
PowerShell示例代码
# 获取你的应用服务主体的ObjectId $myAppRegisterationAppId = "你的应用注册AppId" $myAppSpObjectId = (Get-AzureADServicePrincipal -Filter "AppId eq '$myAppRegisterationAppId'").ObjectId # 获取Graph API访问令牌(需提前登录Azure并拥有Directory.Read.All/Application.Read.All权限) $token = Get-AzAccessToken -ResourceUrl "https://graph.microsoft.com" # 调用Graph API获取所有角色分配 $roleAssignments = Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/servicePrincipals/$myAppSpObjectId/appRoleAssignedTo" -Headers @{Authorization = "Bearer $($token.Token)"} -Method Get # 输出结果(可根据需要筛选,比如只看服务主体类型的分配) $roleAssignments.value | Where-Object {$_.principalType -eq "ServicePrincipal"}
方法二:遍历所有租户内的应用角色分配并筛选
如果更倾向于使用AzureAD模块,可以先查询租户内所有的应用角色分配,再筛选出目标应用作为资源的记录——这种方式会包含来宾服务主体的分配,但在大型租户中可能稍慢。
PowerShell示例代码
$myAppRegisterationAppId = "你的应用注册AppId" $myAppSpObjectId = (Get-AzureADServicePrincipal -Filter "AppId eq '$myAppRegisterationAppId'").ObjectId # 查询所有应用角色分配,筛选出资源为你的应用的记录 $allRoleAssignments = Get-AzureADAppRoleAssignment | Where-Object {$_.ResourceId -eq $myAppSpObjectId} # 查看结果 $allRoleAssignments
额外说明:确认需求方向
如果你的实际需求是获取你的应用被分配了其他应用的角色(而非其他主体被分配了你应用的角色),则需要调整查询逻辑:
- 使用AzureAD模块:
Get-AzureADServicePrincipalAppRoleAssignment -ObjectId $myAppSpObjectId - 使用Graph API:调用
GET /servicePrincipals/$myAppSpObjectId/appRoleAssignments端点
权限要求
无论使用哪种方法,你都需要拥有以下权限之一:
Directory.Read.All(应用/委派权限)Application.Read.All(应用/委派权限)
内容的提问来源于stack exchange,提问作者Raz Ronen
相关产品推荐
相关产品推荐

