You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:20:30