🧑‍💻

Azure のロール割り当て一覧を取得 (PIM を含む)

2024/09/24に公開

はじめに

Azure ロールの割り当て一覧を取得したいとき、管理グループやサブスクリプションレベルであれば Azure ポータルからエクスポートできますが、個々のリソース グループやリソースに割り当てている場合、個々にエクスポートするのは非常に手間です。こちらをスクリプトで取得していきます。

Azure ロール割り当て一覧を取得

以下のようなスクリプトで全サブスクリプション (配下のリソース グループ、リソースを含む) のロール割り当てが取得可能です。

# Azure に接続 (適当にどれか 1 つのサブスクリプションに接続)
Connect-AzAccount -SubscriptionId xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

# サブスクリプション一覧を取得
$subscriptions = Get-AzSubscription

### 1. Azure ロールの一覧を取得 ###########################
# 配列を初期化
$jsonArray = @()

# 各サブスクリプションに対してループ
foreach ($subscription in $subscriptions) {
    # サブスクリプションを切り替え
    Set-AzContext -Subscription $subscription.Id

    # 現在のサブスクリプションのロール割り当て一覧を取得
    $roleAssignment = Get-AzRoleAssignment

    # null でない場合に新しいデータを配列に追加
    if ($null -ne $roleAssignment) {
        $jsonArray += $roleAssignment
    }
}

# 配列全体を JSON に変換してファイルに保存
$jsonArray | ConvertTo-Json -Depth 8 | Set-Content -Path .\roleAssignment.json

ただし、こちらの場合は Active / Eligible の表示がないため、PIM の API から取得します。

PIM の割り当て一覧を取得

以下のドキュメントを参考に PIM の Azure ロール割り当て一覧を取得します。
https://learn.microsoft.com/ja-jp/rest/api/authorization/role-eligibility-schedule-instances/list-for-scope?view=rest-authorization-2020-10-01&tabs=HTTP
https://learn.microsoft.com/ja-jp/rest/api/authorization/role-assignment-schedule-instances/list-for-scope?view=rest-authorization-2020-10-01&tabs=HTTP

### 2. Eligible の一覧を取得 ###########################
# 配列を初期化
$jsonArray = @()

# 各サブスクリプションに対してループ
foreach ($subscription in $subscriptions) {
    # scope を指定
    $scope = "/subscriptions/" + $subscription.Id

    # Eligible の一覧を取得する URI を指定
    $uri = "$scope/providers/Microsoft.Authorization/roleEligibilityScheduleInstances?api-version=2020-10-01"
    
    # API を実行
    $response = Invoke-AzRestMethod -Method GET -Path $uri
    
    # 整形
    $body = $response.Content | ConvertFrom-Json
    
    # 必要なプロパティのみ取得
    $filteredBody = $body.value.properties

    # null でない場合に新しいデータを配列に追加
    if ($null -ne $filteredBody) {
        $jsonArray += $filteredBody
    }
 }

# 配列全体を JSON に変換してファイルに保存
$jsonArray | ConvertTo-Json -Depth 8 | Set-Content -Path .\roleEligible.json


### 3. Active の一覧を取得 ###########################
# 配列を初期化
$jsonArray = @()

# 各サブスクリプションに対してループ
foreach ($subscription in $subscriptions) {
    # scope を指定
    $scope = "/subscriptions/" + $subscription.Id

    # Active の一覧を取得する URI を指定
    $uri = "$scope/providers/Microsoft.Authorization/roleAssignmentScheduleInstances?api-version=2020-10-01"

    # API を実行
    $response = Invoke-AzRestMethod -Method GET -Path $uri
    
    # 整形
    $body = $response.Content | ConvertFrom-Json
    
    # 必要なプロパティのみ取得
    $filteredBody = $body.value.properties

    # null でない場合に新しいデータを配列に追加
    if ($null -ne $filteredBody) {
        $jsonArray += $filteredBody
    }
 }

# 配列全体を JSON に変換してファイルに保存
$jsonArray | ConvertTo-Json -Depth 8 | Set-Content -Path .\roleActive.json

補足

フィルタなどの細かい解説はこちらです。なお、下記ドキュメントに記載があるようにScheduleInstances は現在適用されている割り当てのみ、Schedule のほうは将来有効になる割り当ても含まれます。
https://learn.microsoft.com/ja-jp/rest/api/authorization/privileged-role-eligibility-rest-sample
https://learn.microsoft.com/ja-jp/rest/api/authorization/privileged-role-assignment-rest-sample

Microsoft (有志)

Discussion