首先,为您想要查询的用户定义对象ID。连接到Graph和Azure,以便下面的所有命令都能正常工作。同时,系统上必须安装Azure CLI。
$PrincipalToQuery = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
Connect-Graph
Connect-AzAccount
然后,根据您想要查询的内容,您需要执行不同的代码。
Entra ID角色(活跃)
此命令查询用户当前活动的Entra ID角色,包括所有静态分配的角色(以及通过PIM当前启用的角色)。该命令已经考虑到通过角色可分配组获得的角色。我们添加了两个附加属性,以使输出更易理解。
$AzureRoles = Get-MgBetaRoleManagementDirectoryTransitiveRoleAssignment -All -Filter "principalId eq '$PrincipalToQuery'" -ConsistencyLevel eventual
$Output = foreach ($AzureRole in $AzureRoles) {
$Principal = Get-MgBetaDirectoryObjectById -Ids $AzureRole.principalId
$AzureRole | Add-Member -NotePropertyName PrincipalDisplayName -NotePropertyValue $Principal.AdditionalProperties.displayName
$RoleDefinition = Get-MgBetaRoleManagementDirectoryRoleDefinition -UnifiedRoleDefinitionId $AzureRole.roleDefinitionId
$AzureRole | Add-Member -NotePropertyName RoleDefinitionDisplayName -NotePropertyValue $RoleDefinition.DisplayName
$AzureRole
}
$Output | Select-Object RoleDefinitionDisplayName,DirectoryScopeId,PrincipalDisplayName,PrincipalId,RoleDefinitionId,AppScopeId | Out-GridView
进入ID角色 - PIM(符合条件)
此命令仅返回启用PIM的进入ID角色。它不考虑通过角色可分配组传递的角色,因此我们需要手动检查主体的组,并根据此方式构建结果。根据查询的是用户还是服务主体,我们需要使用Get-MgBetaUserTransitiveMemberOf
或Get-MgBetaServicePrincipalTransitiveMemberOf
。与上述相同,我们添加了两个额外的属性,以使输出更易理解。
$EligibleAzureRolesUnfiltered = Get-MgBetaRoleManagementDirectoryRoleEligibilityScheduleInstance -All
$PrincipalToQueryTransitiveMemberOf = Get-MgBetaUserTransitiveMemberOf -All -UserId $PrincipalToQuery
$EligibleAzureRoles = $EligibleAzureRolesUnfiltered | Where-Object {($_.PrincipalId -eq $PrincipalToQuery) -or ($_.PrincipalId -in $PrincipalToQueryTransitiveMemberOf.Id)}
$Output = foreach ($EligibleAzureRole in $EligibleAzureRoles) {
$Principal = Get-MgBetaDirectoryObjectById -Ids $EligibleAzureRole.principalId
$EligibleAzureRole | Add-Member -NotePropertyName PrincipalDisplayName -NotePropertyValue $Principal.AdditionalProperties.displayName
$RoleDefinition = Get-MgBetaRoleManagementDirectoryRoleDefinition -UnifiedRoleDefinitionId $EligibleAzureRole.roleDefinitionId
$EligibleAzureRole | Add-Member -NotePropertyName RoleDefinitionDisplayName -NotePropertyValue $RoleDefinition.DisplayName
$EligibleAzureRole
}
$Output | Select-Object RoleDefinitionDisplayName,DirectoryScopeId,PrincipalDisplayName,PrincipalId,RoleDefinitionId,AppScopeId | Out-GridView
Azure资源(活动中)
此命令查询用户当前活动的Azure RBAC角色,因此包括所有静态分配的角色(以及通过PIM当前启用的角色)。该命令已经尊重通过组传递的角色(它们不必是可分配角色)。我们还包括了一个额外的查询,用于确定分配所针对的订阅,因为默认情况下,只返回订阅的ID。存在Group-Object
是为了避免多次列出相同的分配(多个订阅可能从更高级别的管理组
继承角色分配)。
$Subscriptions = az account list --all | ConvertFrom-Json
$Output = foreach ($Subscription in $Subscriptions) {
az role assignment list --all --assignee $PrincipalToQuery --include-groups --include-inherited --subscription $Subscription.id | ConvertFrom-Json
}
$GroupedOutput = $Output | Group-Object Id | ForEach-Object {$_.Group | Select-Object -First 1}
$GroupedOutput | ForEach-Object {
$IsInsideSubscription = ($_.scope.split('/'))[1] -eq 'subscriptions'
if ($IsInsideSubscription) {
$SubscriptionId = ($_.scope.split('/'))[2]
$SubscriptionName = (Get-AzSubscription -SubscriptionId $SubscriptionId).Name
$_ | Add-Member -NotePropertyName subscriptionName -NotePropertyValue $SubscriptionName
}
}
$GroupedOutput | Select-Object roleDefinitionName,scope,subscriptionName,principalName,principalId,principalType | Out-GridView
Azure资源 - PIM(符合条件)
此命令仅返回启用了PIM的Azure RBAC角色。它不考虑通过组获得的角色(它们不必是可分配的角色),因此我们需要手动检查主体的组,并根据此方式构建结果。根据查询的是用户还是服务主体,我们需要使用
Get-MgBetaUserTransitiveMemberOf
或
Get-MgBetaServicePrincipalTransitiveMemberOf
。此命令返回的属性已经足够可读,因此我们可以直接输出其结果。
Group-Object
用于避免多次列出相同的分配(多个订阅可能从更高级别的
管理组
继承角色分配)。
$Subscriptions = az account list --all | ConvertFrom-Json
$PrincipalToQueryTransitiveMemberOf = Get-MgBetaUserTransitiveMemberOf -All -UserId $PrincipalToQuery
$Output = foreach ($Subscription in $Subscriptions) {
$EligibleRBACRolesUnfiltered = Get-AzRoleEligibilityScheduleInstance -Scope "/subscriptions/$($Subscription.id)"
$EligibleRBACRoles = $EligibleRBACRolesUnfiltered | Where-Object {($_.PrincipalId -eq $PrincipalToQuery) -or ($_.PrincipalId -in $PrincipalToQueryTransitiveMemberOf.Id)}
$EligibleRBACRoles
}
$Output | Group-Object Id | ForEach-Object {$_.Group | Select-Object -First 1 RoleDefinitionDisplayName,ScopeDisplayName,PrincipalDisplayName,ScopeId,PrincipalId,RoleDefinitionId} | Out-GridView