使用New-AzPolicyExemption创建Azure策略豁免失败及相关问题咨询
Azure策略豁免与分配的PowerShell问题解决
1. 获取策略集定义的内部名称及查看完整Properties属性
- 解决
Get-AzPolicySetDefinition无结果的问题:你当前命令使用了-Custom参数,这只会筛选自定义创建的策略集。如果目标策略集是Azure内置的,这个参数会直接过滤掉结果。建议先移除-Custom参数再尝试匹配显示名称:
$mgmtGroup = 'xxx' $policySetName = 'xxx' Get-AzPolicySetDefinition -ManagementGroupName $mgmtGroup | Where-Object {$_.Properties.DisplayName -eq $policySetName} | Select-Object Name, Properties
- 查看返回对象的所有Properties值,有两种实用方式:
- 直接展开Properties属性,查看所有字段:
Get-AzPolicySetDefinition -ManagementGroupName $mgmtGroup | Where-Object {$_.Properties.DisplayName -eq $policySetName} | Select-Object -ExpandProperty Properties - 用
Format-List *查看对象的全部详细信息,包含Properties下的所有子属性:Get-AzPolicySetDefinition -ManagementGroupName $mgmtGroup | Where-Object {$_.Properties.DisplayName -eq $policySetName} | Format-List *
- 直接展开Properties属性,查看所有字段:
2. 修复New-AzPolicyAssignment的报错问题
你当前的命令存在两个关键问题:
- 第一行变量定义缺少
$符号,正确写法应为$ResourceGroup = Get-AzResourceGroup -Name 'ResourceGroup11',没有$会导致变量未被正确定义,后续引用$ResourceGroup.ResourceId时必然出错。 - 需确保
$intiative能返回单个有效的策略集定义对象,避免返回多个或空对象的情况,建议添加Select-Object -First 1做限制。
修正后的命令:
$ResourceGroup = Get-AzResourceGroup -Name 'ResourceGroup11' $intiative = Get-AzPolicySetDefinition | Where-Object { $_.Properties.DisplayName -eq 'Public' } | Select-Object -First 1 if ($intiative) { New-AzPolicyAssignment -Name 'denyPolicies' -PolicySetDefinition $intiative -Scope $ResourceGroup.ResourceId } else { Write-Error "未找到显示名称为'Public'的策略集定义" }
另外,如果你实际要创建的是策略豁免而非策略分配,需使用New-AzPolicyExemption命令,且需要指定目标策略分配的ID(而非策略集定义),示例如下:
# 先获取目标策略分配的资源ID $policyAssignment = Get-AzPolicyAssignment -Name 'denyPolicies' -Scope $ResourceGroup.ResourceId # 创建策略豁免 New-AzPolicyExemption -Name 'exemptDenyPolicies' -PolicyAssignmentId $policyAssignment.ResourceId -Scope $ResourceGroup.ResourceId -ExemptionCategory "Waiver"
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

