Azure 子网的输出以及连接到附加 VNet、路由 table 和 NSG 的链接

Output of Azure subnets with links to attached VNet, route table and NSG

我目前正在编写一个脚本,该脚本可为我提供 Azure 订阅中每个子网的输出,以及指向 VNet、NSG 和路由的链接 Table。脚本中目前缺少路由 Table 名称,但我现在想专注于修复 NSG。 这是我的脚本的样子:

$VNets = Get-AzVirtualNetwork
$NSG = Get-AzNetworkSecurityGroup
$VNets | ForEach-Object {
    $VNettemp = $_
    $result = $_.Subnets | Select-Object @{Label="Subnet Name";Expression={$_.Name}},@{Label="Subnet";Expression={$_.AddressPrefix}}
    $_ | ForEach-Object {
        $result | Add-Member -Name "VNet Name" -Value $_.Name -MemberType NoteProperty
    }
    if ($_.Subnets.NetworksecurityGroup -ne "null"){
        $NSG | ForEach-Object{
            if ($VNettemp.Subnets.Id -contains $_.Subnets.Id ){
                $result | Add-Member -Name "NSG Name" -Value $_.name -MemberType NoteProperty -Force
            }
        }

    }
return $result
}

输出如下所示:

Subnet Name             Subnet        VNet Name       NSG Name           
-----------             ------        ---------       --------           
default-subnet          10.10.10.0/28 vnet-ine-test   test-nsg           
vnet-ine-test-snet-test 10.10.0.0/24  vnet-ine-test   test-nsg           
default                 10.0.0.0/24   vnet-chn-docker vnet-chn-docker-nsg
vnet-test-subnet        10.0.1.0/24   vnet-chn-docker vnet-chn-docker-nsg

所需的输出如下所示,因为 'default-subnet' 和 'vnet-test-subnet' 没有附加 NSG:

Subnet Name             Subnet        VNet Name       NSG Name
-----------             ------        ---------       --------
default-subnet          10.10.10.0/28 vnet-ine-test           
vnet-ine-test-snet-test 10.10.0.0/24  vnet-ine-test   test-nsg        
default                 10.0.0.0/24   vnet-chn-docker vnet-chn-docker-nsg        
vnet-test-subnet        10.0.1.0/24   vnet-chn-docker         

有人知道如何修复输出吗?我尝试使用 else 语句为“NSG 名称”填充一个空值,但随后整个 VNet 的名称被完全取消。 感谢您的帮助!

问题请参考以下脚本

$VNets = Get-AzVirtualNetwork
$NSG = Get-AzNetworkSecurityGroup
$resports=@()
$info = @{ "Subnet Name"=""; "Subnet"=""; "VNet Name"="" ; "NSG Name"=""}
foreach($VNet in $VNets){
   $info.'VNet Name'=$VNet.Name
   $info.'NSG Name'=$null
   Foreach($sub in $VNet.Subnets){
     $info.'Subnet Name' =$sub.Name
     $info.Subnet=$sub.AddressPrefix
     if($sub.NetworkSecurityGroup -ne $null){
         $NSG | ForEach-Object{
            if ($VNet.Subnets.Id -contains $_.Subnets.Id ){
                $info.'NSG Name'=$_.Name
            }
        }
     
     }
      $obj=New-Object PSObject -Property $info
      $resports +=$obj

   }

  
}