如何使用Azure CLI查找并删除Azure中的孤立角色分配?
查找并删除Azure中孤立的角色分配(Identity not found)
因为az role assignment list不会返回已删除主体的displayName字段,没法直接筛选,所以可以通过检查角色分配对应的主体是否存在来识别孤立分配,再批量删除。下面是两种可直接编写进脚本的实现方式:
Bash脚本实现(依赖Azure CLI和jq工具)
# 替换为你的目标订阅ID SUBSCRIPTION_ID="your-subscription-id" az account set --subscription $SUBSCRIPTION_ID # 获取所有角色分配,提取关键字段并保存为JSON az role assignment list --query "[].{id:id, principalId:principalId, principalType:principalType}" -o json > role_assignments.json # 遍历每个角色分配,检查主体是否存在 while read -r assignment; do ROLE_ASSIGNMENT_ID=$(echo "$assignment" | jq -r '.id') PRINCIPAL_ID=$(echo "$assignment" | jq -r '.principalId') PRINCIPAL_TYPE=$(echo "$assignment" | jq -r '.principalType') # 根据主体类型执行存在性检查 case $PRINCIPAL_TYPE in User) az ad user show --id $PRINCIPAL_ID > /dev/null 2>&1 ;; ServicePrincipal) az ad sp show --id $PRINCIPAL_ID > /dev/null 2>&1 ;; Group) az ad group show --id $PRINCIPAL_ID > /dev/null 2>&1 ;; *) # 跳过其他类型(如托管标识),可按需调整 continue ;; esac # 若主体不存在,删除对应的角色分配 if [ $? -ne 0 ]; then echo "删除孤立角色分配: $ROLE_ASSIGNMENT_ID" az role assignment delete --id $ROLE_ASSIGNMENT_ID fi done < <(jq -c '.[]' role_assignments.json)
PowerShell脚本实现(依赖Az模块)
# 替换为你的目标订阅ID $subscriptionId = "your-subscription-id" Set-AzContext -Subscription $subscriptionId # 获取所有角色分配 $roleAssignments = Get-AzRoleAssignment | Select-Object Id, PrincipalId, PrincipalType foreach ($assignment in $roleAssignments) { $principalExists = $false # 根据主体类型检查是否存在 switch ($assignment.PrincipalType) { "User" { try { Get-AzADUser -ObjectId $assignment.PrincipalId | Out-Null $principalExists = $true } catch {} } "ServicePrincipal" { try { Get-AzADServicePrincipal -ObjectId $assignment.PrincipalId | Out-Null $principalExists = $true } catch {} } "Group" { try { Get-AzADGroup -ObjectId $assignment.PrincipalId | Out-Null $principalExists = $true } catch {} } default { continue } } # 主体不存在则删除角色分配 if (-not $principalExists) { Write-Host "删除孤立角色分配: $($assignment.Id)" Remove-AzRoleAssignment -Id $assignment.Id -Force } }
注意事项
- 执行删除前,建议先注释掉删除命令,只打印待删除的角色分配ID,确认无误后再执行实际删除操作。
- 确保执行脚本的账号拥有User Access Administrator或Owner权限,否则无法删除角色分配。
- 若订阅内角色分配数量较多,可添加分批处理逻辑,避免触发Azure API调用频率限制。
内容的提问来源于stack exchange,提问作者Aswin
相关产品推荐
相关产品推荐

