如何使用PowerShell获取特定资源与指定策略的Azure Policy合规报告
用PowerShell查询指定资源与策略的Azure Policy合规报告
前置要求
- 提前安装Azure PowerShell的Az模块,优先使用Az.Resources 3.0及以上版本
- 操作前先运行
Connect-AzAccount登录目标Azure租户,确保账号持有Policy读取、资源读取权限
具体实现步骤(适配单台VM+Deny-Firewall自定义策略场景)
步骤1:获取目标VM的资源ID
替换占位符为你实际的VM信息,执行命令获取VM的唯一资源标识:
$vm = Get-AzVM -ResourceGroupName "<你的VM所属资源组名>" -Name "<你的VM名称>" $targetResourceId = $vm.Id
步骤2:获取目标策略的定义ID
查询名为Deny-Firewall的自定义策略的ID:
$policyDef = Get-AzPolicyDefinition | Where-Object {$_.Properties.DisplayName -eq "Deny-Firewall" -and $_.Properties.PolicyType -eq "Custom"} $targetPolicyId = $policyDef.Id
如果要查询的是策略集(Initiative)内的策略,将Get-AzPolicyDefinition替换为Get-AzPolicySetDefinition即可
步骤3:查询对应合规记录
按资源ID和策略ID两个条件过滤,获取精准的合规结果:
$complianceReport = Get-AzPolicyState -ResourceId $targetResourceId -Filter "PolicyDefinitionId eq '$targetPolicyId'"
步骤4:格式化输出合规报告
按需提取核心字段输出可视化结果:
$complianceReport | Select-Object @{Name="资源名称";Expression={$vm.Name}}, @{Name="策略名称";Expression={"Deny-Firewall"}}, @{Name="合规状态";Expression={$_.ComplianceState}}, @{Name="最后评估时间";Expression={$_.Timestamp}}, PolicyAssignmentName, PolicyAssignmentScope | Format-Table -AutoSize
常见问题说明
如果查询结果为空,通常是策略还未完成首次评估,或策略分配范围未覆盖当前VM。你可以手动触发资源组级别的策略评估,等待5-10分钟后再查询:
Start-AzPolicyComplianceScan -ResourceGroupName "<你的VM所属资源组名>"合规状态字段说明:
Compliant为合规,NonCompliant为不合规,NotApplicable为该策略不适用于当前资源。
内容的提问来源于stack exchange,提问作者Yogesh Kulkarni
相关产品推荐
相关产品推荐

