获取AD组关联的Azure资源/资源组列表,完成标签批量更新
获取与AD组关联的Azure资源/资源组列表的方法
针对你有17000+ Azure AD组、需要获取关联资源/资源组来批量更新标签的需求,下面提供两种实用的批量处理方案:
方法1:Azure PowerShell 脚本
适合熟悉PowerShell的场景,可直接导出结构化结果:
步骤:
- 登录Azure账号(自动化脚本建议用服务主体登录):
Connect-AzAccount # 多订阅场景切换目标订阅:Set-AzContext -SubscriptionId "你的订阅ID"
- 导出目标AD组列表(已有AD组ObjectID列表可跳过):
# 可按组名前缀过滤,替换成你的实际规则 Get-AzADGroup -Filter "DisplayName starts with 'YourGroupPrefix'" | Select-Object ObjectID, DisplayName | Export-Csv -Path "ADGroups.csv" -NoTypeInformation
- 批量遍历AD组,抓取关联资源:
$adGroups = Import-Csv -Path "ADGroups.csv" $results = @() foreach ($group in $adGroups) { # 获取该组的所有RBAC权限分配(加 -IncludeInherited $false 仅取直接分配的权限) $roleAssignments = Get-AzRoleAssignment -ObjectId $group.ObjectID foreach ($ra in $roleAssignments) { # 判断是资源组还是单个资源 $resourceType = if ($ra.Scope -match "/resourceGroups/([^/]+)$") { "ResourceGroup" } else { "Resource" } $resourceName = $resourceType -eq "ResourceGroup" ? $matches[1] : ($ra.Scope -split "/")[-1] $results += [PSCustomObject]@{ ADGroupName = $group.DisplayName ADGroupObjectID = $group.ObjectID ResourceType = $resourceType ResourceName = $resourceName ResourceFullScope = $ra.Scope AssignedRole = $ra.RoleDefinitionName } } # 加延迟避免API限流,17000个组建议保留此设置 Start-Sleep -Milliseconds 500 } # 导出结果到CSV,供你的标签更新脚本使用 $results | Export-Csv -Path "ADGroup_Associated_Resources.csv" -NoTypeInformation
注意事项:
- 执行账号需要Reader或RBAC管理员权限,才能读取所有RBAC分配
- 多订阅场景需在循环中切换订阅,或用
Get-AzRoleAssignment -Scope "/subscriptions/订阅ID"指定订阅 - 若遇API限流,可延长延迟时间,或拆分AD组列表分批次处理
方法2:Azure CLI + Bash 脚本
适合Linux/macOS环境或偏好CLI的用户:
步骤:
- 登录Azure账号:
az login # 多订阅场景切换:az account set --subscription "你的订阅ID"
- 导出AD组列表:
# 按组名前缀过滤,替换成你的规则 az ad group list --filter "displayName starts with 'YourGroupPrefix'" --query "[].{objectId:objectId, displayName:displayName}" --output csv > ADGroups.csv
- 批量抓取关联资源(需提前安装
jq处理JSON):
#!/bin/bash # 初始化结果文件 echo "ADGroupName,ADGroupObjectID,ResourceType,ResourceName,ResourceFullScope,AssignedRole" > ADGroup_Associated_Resources.csv # 遍历AD组列表 while IFS=, read -r objectId displayName do # 获取该组的RBAC分配(加 --include-inherited false 仅取直接分配权限) az role assignment list --assignee "$objectId" --query "[].{scope:scope, roleDefinitionName:roleDefinitionName}" --output json | \ jq -r --arg dn "$displayName" --arg oid "$objectId" '.[] | .resourceType = (if .scope | test("/resourceGroups/[^/]+$") then "ResourceGroup" else "Resource" end) | .resourceName = (if .resourceType == "ResourceGroup" then (.scope | split("/")[-1]) else (.scope | split("/")[-1]) end) | [$dn, $oid, .resourceType, .resourceName, .scope, .roleDefinitionName] | @csv' >> ADGroup_Associated_Resources.csv # 延迟避免限流 sleep 0.5 done < ADGroups.csv
注意事项:
- 安装
jq:Ubuntu/Debian用sudo apt install jq,macOS用brew install jq - 跨订阅场景需遍历所有订阅:
az account list --query "[].id" --output tsv | while read sub; do az account set --subscription "$sub"; ...; done
内容的提问来源于stack exchange,提问作者Shashwat Kumar Singh
相关产品推荐
相关产品推荐

