如何通过PowerShell获取Azure订阅下子资源的PIM角色分配?
解决方案:获取Azure订阅下所有子资源的PIM角色分配
PowerShell 实现方案
步骤1:递归枚举订阅下所有子资源ID
首先需要获取订阅层级及所有子资源(资源组、VM、存储账户等)的ID,可通过Az模块完成:
# 定位目标订阅 $sub = Get-AzSubscription -SubscriptionId "你的订阅ID" Set-AzContext -Subscription $sub.Id # 收集所有资源ID(含订阅自身、资源组、资源实例) $allResourceIds = @() $allResourceIds += "/subscriptions/$($sub.Id)" $allResourceIds += (Get-AzResourceGroup).ResourceId $allResourceIds += (Get-AzResource).ResourceId # 去重避免重复查询 $allResourceIds = $allResourceIds | Select-Object -Unique
步骤2:遍历资源ID获取PIM角色分配
逐个调用Get-AzureADMSPrivilegedRoleAssignment获取每个资源的PIM分配,并合并结果:
$allPIMAssignments = @() foreach ($resourceId in $allResourceIds) { try { # 启用-All参数处理分页,避免遗漏结果 $assignments = Get-AzureADMSPrivilegedRoleAssignment -ProviderId AzureResources -ResourceId $resourceId -All $true if ($assignments) { $allPIMAssignments += $assignments } } catch { Write-Warning "获取资源 $resourceId 的PIM分配失败:$_" } } # 导出结果到CSV $allPIMAssignments | Export-Csv -Path "订阅及子资源PIM分配.csv" -NoTypeInformation
Microsoft Graph API 实现方案
核心请求逻辑
利用Graph API的privilegedAccess/azureResources/roleAssignments端点,通过startswith过滤器匹配所有以目标订阅ID为前缀的资源分配(子资源ID均继承订阅ID前缀),直接一次性获取所有结果:
请求URL(GET)
https://graph.microsoft.com/v1.0/privilegedAccess/azureResources/roleAssignments?$filter=startswith(resourceId, '/subscriptions/{你的订阅ID}')&$expand=roleDefinition,subject
权限要求
需为执行账户/应用授予以下权限(Delegated或Application类型均可):
PrivilegedAccess.Read.AzureResources
PowerShell调用Graph API示例
# 获取Graph访问令牌(基于Az模块登录态) $token = Get-AzAccessToken -ResourceUrl "https://graph.microsoft.com" $headers = @{ "Authorization" = "Bearer $($token.Token)" "Content-Type" = "application/json" } $subscriptionId = "你的订阅ID" $url = "https://graph.microsoft.com/v1.0/privilegedAccess/azureResources/roleAssignments`?$filter=startswith(resourceId, '/subscriptions/$subscriptionId')&`$expand=roleDefinition,subject" # 处理分页获取全部结果 $allAssignments = @() do { $response = Invoke-RestMethod -Uri $url -Headers $headers -Method Get $allAssignments += $response.value $url = $response.'@odata.nextLink' } while ($url) # 导出结果 $allAssignments | Export-Csv -Path "Graph_订阅及子资源PIM分配.csv" -NoTypeInformation
注意事项
- 权限校验:执行账户需拥有
Privileged Role Administrator或Global Administrator角色,且已被授予PIM资源的读取权限。 - 分页处理:当PIM分配数量较多时,必须处理分页逻辑(上述示例已覆盖),避免丢失结果。
- 性能对比:Graph API的过滤方式无需遍历所有资源,效率远高于PowerShell逐个查询,推荐优先使用。
内容的提问来源于stack exchange,提问作者Johnny Welker
相关产品推荐
相关产品推荐

