🧑💻
Azure のロール割り当て一覧を取得 (PIM を含む)
はじめに
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 ロール割り当て一覧を取得します。
### 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 のほうは将来有効になる割り当ても含まれます。
Discussion