如何通过PowerShell获取Azure策略的非合规资源及违规原因
整合Azure策略合规状态与策略定义的PowerShell脚本优化
问题背景
现有两个独立的PowerShell脚本:一个用于获取非合规的策略状态数据,但缺少违规资源的详情(如资源ID、名称)和具体违规原因;另一个用于导出策略定义信息,需要手动通过Excel的VLOOKUP关联策略引用ID才能拿到策略描述。需要将两者整合,通过单次查询获取所有所需数据,无需手动二次处理。
优化后的完整脚本
# 配置参数 $managementGroupName = 'xx' $policySetName = 'xxx' $outputPath = "C:\data\output_$(get-date -f dd-MM-yyyyHHMM).csv" # 获取目标策略集定义,提取内部关联的策略引用 $policySet = Get-AzPolicySetDefinition -ManagementGroupName $managementGroupName -Name $policySetName $policyRefMap = @{} foreach ($ref in $policySet.Properties.PolicyDefinitions) { $policyDef = Get-AzPolicyDefinition -Id $ref.PolicyDefinitionId $policyRefMap[$ref.PolicyDefinitionReferenceId] = @{ PolicyDisplayName = $policyDef.Properties.DisplayName PolicyDescription = $policyDef.Properties.Description } } # 获取非合规状态数据,关联策略定义信息并补充资源详情、违规原因 $complianceResults = Get-AzPolicyState -ManagementGroupName $managementGroupName -Filter "ComplianceState eq 'NonCompliant' and PolicySetDefinitionName eq '$policySetName'" ` | Select-Object ` Timestamp, ` SubscriptionId, ` ResourceLocation, ` ResourceGroup, ` ResourceId, ` ResourceName, ` PolicySetDefinitionName, ` ManagementGroupIds, ` PolicyDefinitionReferenceId, ` ComplianceState, ` PolicyDefinitionAction, ` ResourceTags, ` @{n='PolicyDisplayName';E={$policyRefMap[$_.PolicyDefinitionReferenceId].PolicyDisplayName}}, ` @{n='PolicyDescription';E={$policyRefMap[$_.PolicyDefinitionReferenceId].PolicyDescription}}, ` @{n='NonComplianceReason';E={$_.Properties.NonComplianceReason.Message}} # 导出整合后的数据到CSV $complianceResults | Export-Csv -NoTypeInformation -Path $outputPath
脚本说明
- 精准获取策略关联关系:先定位目标策略集,只提取该策略集内引用的策略定义,避免获取无关数据,提升查询效率
- 自动关联策略描述:通过哈希表存储策略引用ID与策略显示名、描述的映射,在获取合规状态时直接匹配,无需手动用Excel关联
- 补充关键缺失字段:
ResourceId/ResourceName:明确违规的具体资源PolicyDisplayName/PolicyDescription:直接展示违规策略的名称和规则描述NonComplianceReason:获取非合规的具体原因,清晰定位违规点
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

