使用Azure PowerShell创建虚拟机提示资源被策略拦截,门户可正常创建求排查
PowerShell创建VM被「Not allowed resource types」策略拦截 排查指南
场景匹配:同订阅、同账号权限下,Azure门户可正常创建VM,执行PowerShell命令时,无参数调用
New-AzVM,输入VM名test后立刻报错被「Not allowed resource types」策略拦截。
核心差异原因
策略的拦截逻辑是校验请求中携带的全部资源类型(包括预检阶段的冗余类型),只要请求里带了被禁的资源,哪怕你根本不打算创建该资源,也会直接被拦:
- 门户创建VM的请求构造逻辑,会自动省略无必要的冗余资源类型,完全匹配企业策略的校验规则,所以能正常提交
- 你当前使用的无参数交互模式
New-AzVM,请求构造逻辑和门户差异很大,会自动附带被策略禁止的冗余资源,在最初的预检阶段就被拦截,根本走不到后续的参数选择步骤
具体排查&解决步骤
先确认策略到底禁了什么
拿到报错里提供的策略定义ID,直接执行PowerShell命令拉取规则详情,不要凭猜测排查:# 替换为报错信息中给出的policyDefinition ID $policyRule = Get-AzPolicyDefinition -Id "/providers/Microsoft.Authorization/policyDefinitions/XXXXXXXX" # 输出策略明确禁止的资源类型列表 $policyRule.Properties.PolicyRule.then.notIn.resourceType绝大多数同类场景下,被拦的根本不是虚拟机本身,而是
New-AzVM自动附带创建的冗余资源,比如:- 自动生成的通用SKU存储账户
- 适配经典部署模型的网络、可用性集资源
- 未明确指定用途的VM扩展资源
调整PowerShell调用方式,避免触发冗余资源创建
- 彻底弃用无参数的交互模式
New-AzVM(也就是直接敲New-AzVM、靠逐行提示输参数的用法)——这种模式的设计逻辑是自动补全所有依赖资源,很多自动补全的内容正好是企业策略禁止的 - 所有VM依赖的前置资源(资源组、VNet、子网、NSG、公共IP等)提前单独创建完成,调用
New-AzVM时显式指定复用这些现有资源,不让命令自动生成新的关联资源,参考命令模板:$vmConfig = @{ ResourceGroupName = "提前创建好的资源组名" Name = "test" Location = "资源所在区域" Image = "Win2022Datacenter" Size = "Standard_D2s_v3" VirtualNetworkName = "提前创建好的VNet名" SubnetName = "提前创建好的子网名" SecurityGroupName = "提前创建好的NSG名" PublicIpAddressName = "提前创建好的公共IP名" } New-AzVM @vmConfig - 升级本地Az.Compute模块到最新版本:老版本模块的交互模式会错误把经典部署模型的资源类型放到预检请求里,和当前企业基于ARM的策略完全不兼容,升级后这类冗余请求会被移除
- 彻底弃用无参数的交互模式
特殊场景处理
如果查完策略规则发现,拦截的资源是创建VM必须依赖的类型,直接联系订阅的策略管理员,针对你的操作路径(特定资源组/你的账号)加策略豁免,把对应资源类型从拦截规则里排除。
内容的提问来源于stack exchange,提问作者srinathsarman
相关产品推荐
相关产品推荐

