utilities/tools/Get-RoleAssignmentList.ps1 (112 lines of code) (raw):

<# .SYNOPSIS Fetch relevant Role Definitions for the given ProviderNamespace .DESCRIPTION Fetch relevant Role Definitions for the given ProviderNamespace by default. Optionally, you can fetch all available roles or include custom roles as well. 'Relevant' roles include the most common roles (e.g., Reader, Owner, etc.), as well as those that tie directly into the targeted resource type (e.g., a `Key Vault Secrets Reader` for a Key Vault). Leverges Microsoft Docs's [https://learn.microsoft.com/en-us/powershell/module/az.resources/get-azroledefinition?view=azps-8.3.0] to fetch the data .PARAMETER ProviderNamespace Optional. The Provider Namespace to fetch the role definitions for .PARAMETER ResourceType Optional. The ResourceType to fetch the role definitions for .PARAMETER IncludeCustomRoles Optional. Whether to include custom roles or not .PARAMETER All Optional. Fetch all available roles that can be applied to the given Resource Type. By default it only fetches the relevant roles. .EXAMPLE Get-RoleAssignmentList -ProviderNamespace 'Microsoft.KeyVault' -ResourceType 'vaults' Fetch all available Role Definitions for ProviderNamespace [Microsoft.KeyVault/vaults], excluding custom roles #> function Get-RoleAssignmentList { [CmdletBinding()] param( [Parameter(Mandatory = $false)] [string] $ProviderNamespace, [Parameter(Mandatory = $false)] [string] $ResourceType, [Parameter(Mandatory = $false)] [switch] $IncludeCustomRoles, [Parameter(Mandatory = $false)] [switch] $All ) begin { Write-Debug ('{0} entered' -f $MyInvocation.MyCommand) } process { ################# ## Get Roles ## ################# $roleDefinitions = Get-AzRoleDefinition # Filter Custom Roles if (-not $IncludeCustomRoles) { $roleDefinitions = $roleDefinitions | Where-Object { -not $_.IsCustom } } $relevantRoles = [System.Collections.ArrayList]@() # No role filtering for the [Microsoft.Authorization/RoleAssignments] module # selecting only relevant roles for all other modules if ("$ProviderNamespace/$ResourceType" -eq 'Microsoft.Authorization/RoleAssignments') { # No filter $relevantRoles = $roleDefinitions } else { # Filter Action based if ($All) { $relevantRoles += $roleDefinitions | Where-Object { $_.Actions -like "$ProviderNamespace/$ResourceType/*" -or $_.Actions -like "$ProviderNamespace/`**" -or $_.Actions -like '`**' -or $_.DataActions -like "$ProviderNamespace/$ResourceType/*" -or $_.DataActions -like "$ProviderNamespace/`**" -or $_.DataActions -like '`**' } } else { $relevantRoles += $roleDefinitions | Where-Object { $_.Actions -like "$ProviderNamespace/$ResourceType/*" -or $_.Actions -like "$ProviderNamespace/`**" -or $_.DataActions -like "$ProviderNamespace/$ResourceType/*" -or $_.DataActions -like "$ProviderNamespace/`**" -or # Leave general roles (https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#general) $_.Id -eq 'b24988ac-6180-42a0-ab88-20f7382dd24c' -or # Contributor $_.Id -eq '8e3af657-a8ff-443c-a75c-2fe8c4bcb635' -or # Owner $_.Id -eq 'acdd72a7-3385-48ef-bd42-f606fba81ae7' -or # Reader $_.Id -eq 'f58310d9-a9f6-439a-9e8d-f62e7b41a168' -or # Role Based Access Control Administrator $_.Id -eq '18d7d88d-d35e-4fb5-a5c3-7773c20a72d9' # User Access Administrator } } # (Bicep-only) To comply with Bicep Linter Rule prefer-unquoted-property-names, remove quotes from role names not containing spaces $resBicep = [System.Collections.ArrayList]@() $resArm = [System.Collections.ArrayList]@() if ("$ProviderNamespace/$ResourceType" -ne 'Microsoft.Authorization/RoleAssignments') { foreach ($role in $relevantRoles | Sort-Object -Property 'Name' -Unique) { if ($role.Name -match '\s') { $resBicep += "'{0}': subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '{1}')" -f $role.Name, $role.Id } else { $resBicep += "{0}: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '{1}')" -f $role.Name, $role.Id } $resArm += "`"{0}`": `"[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '{1}')]`"," -f $role.Name, $role.Id } } else { # different output format for the 'Microsoft.Authorization/RoleAssignments' module foreach ($role in $relevantRoles | Sort-Object -Property 'Name' -Unique) { if ($role.Name -match '\s') { $resBicep += "'{0}': '/providers/Microsoft.Authorization/roleDefinitions/{1}'" -f $role.Name, $role.Id } else { $resBicep += "{0}: '/providers/Microsoft.Authorization/roleDefinitions/{1}'" -f $role.Name, $role.Id } $resArm += "`"{0}`": `"/providers/Microsoft.Authorization/roleDefinitions/{1}`"" -f $role.Name, $role.Id } } # Return arrays return @{ bicepFormat = $resBicep armFormat = $resArm } } end { Write-Debug ('{0} exited' -f $MyInvocation.MyCommand) } } }