Azure Custom Roleの割り当てる情報を抽出する

# Azure カスタムロール割り当てを取得するPowerShellスクリプト

Azure環境でカスタムロールの割り当てを取得し、CSVファイルにエクスポートするPowerShellスクリプトを紹介します。このスクリプトは、リソースグループおよびストレージアカウントに対するカスタムロールの割り当てを取得し、ユーザ名、グループ名、またはプリンシパル名を含む詳細情報をCSVファイルに保存します。

# スクリプトの概要
このスクリプトは以下の手順で動作します：

①カスタムロールの定義を取得します。
②各リソースグループおよびストレージアカウントに対してカスタムロールの割り当てを取得します。
③割り当てられたプリンシパルの名前を取得します。
④取得した情報をCSVファイルにエクスポートします。

# スクリプトの詳細
以下にスクリプトの詳細を示します。
## カスタムロールの定義を取得
まず、カスタムロールの定義を取得し、リストに保存します。
 
```カスタムロールの割り当て状況を保存するためのリスト
$customRoleAssignments = @()

# カスタムロールのみを取得
$customRoles = Get-AzRoleDefinition | Where-Object { $_.IsCustom -eq $true }
```

## プリンシパル名を取得する関数
次に、ObjectIDからユーザ名、グループ名、またはプリンシパル名を取得する関数を定義します。
```
# ObjectIDからユーザ名またはグループ名またはプリンシパル名を取得する関数
function Get-PrincipalName {
    param (
        [string]$ObjectId
    )

    $principal = Get-AzADUser -ObjectId $ObjectId -ErrorAction SilentlyContinue
    if (-not $principal) {
        $principal = Get-AzADGroup -ObjectId $ObjectId -ErrorAction SilentlyContinue
    }
    if (-not $principal) {
        $principal = Get-AzADServicePrincipal -ObjectId $ObjectId -ErrorAction SilentlyContinue
    }

    return $principal.DisplayName
}
```
## リソースグループごとのカスタムロール割り当てを取得
リソースグループごとにカスタムロールの割り当てを取得し、プリンシパル名を取得してリストに追加します。
```
# リソースグループごとのカスタムロール割り当てを取得
foreach ($resourceGroup in $resourceGroups) {
    write-output($resourceGroup.ResourceGroupName)
    foreach ($role in $customRoles) {
        $assignments = Get-AzRoleAssignment -Scope $resourceGroup.ResourceId -RoleDefinitionName $role.Name -ErrorAction SilentlyContinue
        if ($assignments) {
            foreach ($assignment in $assignments) {
                try {
                    $principalName = Get-PrincipalName -ObjectId $assignment.PrincipalId
                    Write-Output($principalName)
                    $customRoleAssignments += [PSCustomObject]@{
                        ResourceName = $resourceGroup.ResourceGroupName
                        ResourceId = $resourceGroup.ResourceId
                        ResourceType = "Microsoft.Resources/resourceGroups"
                        RoleName = $role.Name
                        PrincipalName = $principalName
                        PrincipalType = $assignment.PrincipalType
                    }
                } catch {
                    Write-Warning "エラーが発生しました: $_"
                    $customRoleAssignments += [PSCustomObject]@{
                        ResourceName = $resourceGroup.ResourceGroupName
                        ResourceId = $resourceGroup.ResourceId
                        ResourceType = "Microsoft.Resources/resourceGroups"
                        RoleName = $role.Name
                        PrincipalName = "Error: $_"
                        PrincipalType = $assignment.PrincipalType
                    }
                }
            }
        }
    }
}
```

## ストレージアカウントごとのカスタムロール割り当てを取得
ストレージアカウントごとにカスタムロールの割り当てを取得し、プリンシパル名を取得してリストに追加します。

```
# Azure Storage AccountおよびAzure Filesごとのカスタムロール割り当てを取得
foreach ($resource in $resources) {
    write-output($resource.Name)
    foreach ($role in $customRoles) {
        $assignments = Get-AzRoleAssignment -Scope $resource.Id -RoleDefinitionName $role.Name -ErrorAction SilentlyContinue
        if ($assignments) {
            foreach ($assignment in $assignments) {
                try {
                    $principalName = Get-PrincipalName -ObjectId $assignment.PrincipalId
                    Write-Output($principalName)
                    $customRoleAssignments += [PSCustomObject]@{
                        ResourceName = $resource.Name
                        ResourceId = $resource.Id
                        ResourceType = $resource.ResourceType
                        RoleName = $role.Name
                        PrincipalName = $principalName
                        PrincipalType = $assignment.PrincipalType
                    }
                } catch {
                    Write-Warning "エラーが発生しました: $_"
                    $customRoleAssignments += [PSCustomObject]@{
                        ResourceName = $resource.Name
                        ResourceId = $resource.Id
                        ResourceType = $resource.ResourceType
                        RoleName = $role.Name
                        PrincipalName = "Error: $_"
                        PrincipalType = $assignment.PrincipalType
                    }
                }
            }
        }
    }
}
```
## 結果をCSVファイルに保存
最後に、取得した情報をCSVファイルに保存します。
```
# 結果をCSVファイルに保存
$csvPath = "$HOME/CustomRoleAssignments.csv"
$customRoleAssignments | Export-Csv -Path $csvPath -NoTypeInformation

# ファイルの保存場所を表示
Write-Output "CSV file saved to: $csvPath"
```

# まとめ
このスクリプトを使用することで、Azure環境におけるカスタムロールの割り当て状況を簡単に取得し、CSVファイルにエクスポートすることができます。エラーが発生した場合でもスクリプトが中断せず、エラーメッセージを含む情報がCSVファイルに保存されるため、後で確認することができます。

Azure 環境の管理に携わる方々にとって、今回ご紹介したスクリプトが日々の作業効率を向上させる一助となれば幸いです。ぜひこのスクリプトを活用して、Azure 環境の管理を効率化してください。