如何使用PowerShell从Azure虚拟机对象获取Azure网络安全组对象
如何从Azure虚拟机对象获取关联的网络安全组(NSG)对象
问题原因
你遇到的NetworkSecurityGroup属性为null,主要有两个可能:
- 默认
Get-AzNetworkInterface命令不会自动加载关联的NSG详细信息,需要显式指定展开属性 - 你的NSG可能是关联在子网而非虚拟机的网卡(NIC)上
解决方法
方法1:获取网卡时展开NSG属性
如果NSG直接绑定在NIC上,只需在获取NIC时加上-ExpandProperty NetworkSecurityGroup参数,就能加载完整的NSG对象:
# 获取目标VM对象 $vm = Get-AzVM -ResourceGroupName $azRgName -Name $azVmName # 获取NIC并展开关联的NSG属性 $nic = Get-AzNetworkInterface -ResourceId $vm.NetworkProfile.NetworkInterfaces[0].Id -ExpandProperty NetworkSecurityGroup # 提取NSG对象 $nsg = $nic.NetworkSecurityGroup
方法2:从子网获取关联的NSG
如果NSG绑定在子网层级,需要从NIC关联的子网入手:
# 获取VM的NIC对象 $nic = Get-AzNetworkInterface -ResourceId $vm.NetworkProfile.NetworkInterfaces[0].Id # 获取NIC所属子网的资源ID $subnetId = $nic.IpConfigurations[0].Subnet.Id # 获取子网配置并提取NSG的资源ID $subnetNsgId = (Get-AzVirtualNetworkSubnetConfig -ResourceId $subnetId).NetworkSecurityGroup.Id # 根据ID获取NSG对象 if ($subnetNsgId) { $nsg = Get-AzNetworkSecurityGroup -ResourceId $subnetNsgId }
方法3:批量查询VM关联的所有NSG
如果不确定NSG绑定在NIC还是子网,可以一次性查询所有关联的NSG:
# 获取VM的NIC资源ID $nicId = $vm.NetworkProfile.NetworkInterfaces[0].Id # 获取NIC所属子网的资源ID $subnetId = (Get-AzNetworkInterface -ResourceId $nicId).IpConfigurations[0].Subnet.Id # 查询所有关联到NIC或子网的NSG $relatedNsg = Get-AzNetworkSecurityGroup | Where-Object { $_.AssociatedResources -contains $nicId -or $_.AssociatedResources -contains $subnetId } | Select-Object -Unique
内容的提问来源于stack exchange,提问作者g.pickardou
相关产品推荐
相关产品推荐

