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

如何通过策略显示名称触发Azure Policy指定修复任务?

通过策略显示名称触发Azure Policy修复任务

问题背景

现有PowerShell脚本依赖GUID形式的PolicyAssignmentName触发Azure Policy修复任务,可读性差,且会因策略分配的一对多关系生成大量冗余任务。希望改用Azure门户中显示的策略定义名称(如Configure diagnostic settings for Storage Accounts to Log Analytics workspace、Deploy Diagnostic Settings for Key Vault to Log Analytics workspace)指定特定策略生成修复任务,但之前尝试用Get-AzPolicyState获取策略显示名称未成功。

原脚本如下:

$InitiativeAssignmentName = "xxxx"
   
# Loop through each policy and create individual remediation tasks
foreach ($policy in $RemediatablePolicies) {
       $remediationName = "rem." + $policy.PolicyDefinitionReferenceId
       write-output "Starting the remediation with label ==> $remediationName at $(Get-Date)"
    if (!([string]::IsNullOrEmpty($policy.PolicyDefinitionReferenceId)))
    {
       Start-AzPolicyRemediation -Name $remediationName -PolicyAssignmentId $policy.PolicyAssignmentId -PolicyDefinitionReferenceId $policy.PolicyDefinitionReferenceId -ResourceDiscoveryMode ReEvaluateCompliance
   }
}

解决方案

步骤1:精准获取目标策略的核心信息

直接从策略分配和策略定义对象中提取显示名称、PolicyAssignmentId和PolicyDefinitionReferenceId,替代原有的GUID依赖:

# 定义需要触发修复的策略显示名称列表
$targetPolicyDisplayNames = @(
    "Configure diagnostic settings for Storage Accounts to Log Analytics workspace",
    "Deploy Diagnostic Settings for Key Vault to Log Analytics workspace"
)

# 获取计划分配的详细信息(替换为Azure门户中显示的计划分配名称,非GUID)
$initiativeAssignment = Get-AzPolicyAssignment -Name "你的计划分配名称"

# 遍历计划内的策略引用,匹配目标显示名称
$targetPolicies = foreach ($ref in $initiativeAssignment.Properties.PolicyDefinitionReferences) {
    $policyDef = Get-AzPolicyDefinition -Id $ref.PolicyDefinitionId
    if ($targetPolicyDisplayNames -contains $policyDef.Properties.DisplayName) {
        [PSCustomObject]@{
            PolicyAssignmentId = $initiativeAssignment.ResourceId
            PolicyDefinitionReferenceId = $ref.ReferenceId
            PolicyDisplayName = $policyDef.Properties.DisplayName
        }
    }
}

步骤2:触发指定策略的修复任务

基于筛选后的目标策略信息,执行精准修复:

foreach ($policy in $targetPolicies) {
    # 生成可读性强的修复任务名称
    $remediationName = "rem.$($policy.PolicyDisplayName -replace '\s+', '-')"
    Write-Output "Starting remediation for policy: $($policy.PolicyDisplayName) at $(Get-Date)"
    
    if (![string]::IsNullOrEmpty($policy.PolicyDefinitionReferenceId)) {
        Start-AzPolicyRemediation -Name $remediationName `
            -PolicyAssignmentId $policy.PolicyAssignmentId `
            -PolicyDefinitionReferenceId $policy.PolicyDefinitionReferenceId `
            -ResourceDiscoveryMode ReEvaluateCompliance
    }
}

关键说明

  • 将"你的计划分配名称"替换为Azure门户中可见的计划分配名称,彻底摆脱GUID依赖。
  • 通过$targetPolicyDisplayNames列表精准指定需要修复的策略,避免生成冗余任务。
  • 修复任务名称基于策略显示名称标准化生成,便于后续识别和管理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:06:11