You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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
    }
}

注意事项

  1. 执行删除前,建议先注释掉删除命令,只打印待删除的角色分配ID,确认无误后再执行实际删除操作。
  2. 确保执行脚本的账号拥有User Access Administrator或Owner权限,否则无法删除角色分配。
  3. 若订阅内角色分配数量较多,可添加分批处理逻辑,避免触发Azure API调用频率限制。

内容的提问来源于stack exchange,提问作者Aswin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 17:55:15