如何使用 powershell 从所有订阅中列出 Azure 网络安全组

How to List Azure Network Security Group from all Subscription using powershell

我正在尝试创建一个 PowerShell 脚本来列出 Azure 网络安全组及其所有订阅的规则并将其导出到 CSV。

下面是我的代码,其中列出了所有 NSG 规则名称、描述、优先级、SourceAddressPrefix、SourcePortRange、DestinationAddressPrefix、DestinationPortRange、协议、访问和方向。

############# List All Azure Network Security Groups #############
$subs = Get-AzSubscription

foreach ($sub in $subs) {
    Select-AzSubscription -SubscriptionId $sub.Id
    $nsgs = Get-AzNetworkSecurityGroup

    Foreach ($nsg in $nsgs) {
        $nsgRules = $nsg.SecurityRules

        foreach ($nsgRule in $nsgRules) {
            $nsgRule | Select-Object @{n='SubscriptionName';e={$sub.Name}},
                @{n='ResourceGroupName';e={$nsg.ResourceGroupName}},
                @{n='NetworkSecurityGroupName';e={$nsg.Name}},
                Name,Description,Priority,
                @{Name='SourceAddressPrefix';Expression={[string]::join(",", ($_.SourceAddressPrefix))}},
                @{Name='SourcePortRange';Expression={[string]::join(",", ($_.SourcePortRange))}},
                @{Name='DestinationAddressPrefix';Expression={[string]::join(",", ($_.DestinationAddressPrefix))}},
                @{Name='DestinationPortRange';Expression={[string]::join(",", ($_.DestinationPortRange))}},
                Protocol,Access,Direction |
                    Export-Csv "C:\Users\admin-vishal.singh\Desktop\Test\nsg\NsgRules.csv" -NoTypeInformation -Encoding ASCII -Append        
        }
    }
}

我为上面的脚本得到的输出

我还尝试调用 object 资源组,$nsgRule 下的 SubscriptionName | Select-Object 它给了我空白列 header Resourcegroup, subscriptionName.

我正在尝试获得这样的输出:

我不知道我需要在哪个 for 循环中进行更改才能获得如上所示的输出。

基本上,我试图列出所有 Azure NSG,其中包含来自所有订阅的规则以及相应的 ResourcegroupName、subscriptionName。

您想要 return 的额外属性与 $nsgRule 属于不同的对象。您仍然可以通过使用 Select-Object 的计算属性来检索这些属性。

$subs = Get-AzureRmSubscription

foreach ($sub in $subs) {
    Select-AzureRmSubscription -SubscriptionId $sub.Id
    $nsgs = Get-AzureRmNetworkSecurityGroup

    Foreach ($nsg in $nsgs) {
        $nsgRules = $nsg.SecurityRules

        foreach ($nsgRule in $nsgRules) {
            $nsgRule | Select-Object @{n='SubscriptionName';e={$sub.Name}},
                @{n='ResourceGroupName';e={$nsg.ResourceGroupName}},
                @{n='NetworkSecurityGroupName';e={$nsg.Name}},
                Name,Description,Priority,
                @{Name='SourceAddressPrefix';Expression={[string]::join(",", ($_.SourceAddressPrefix))}},
                @{Name='SourcePortRange';Expression={[string]::join(",", ($_.SourcePortRange))}},
                @{Name='DestinationAddressPrefix';Expression={[string]::join(",", ($_.DestinationAddressPrefix))}},
                @{Name='DestinationPortRange';Expression={[string]::join(",", ($_.DestinationPortRange))}},
                Protocol,Access,Direction |
                    Export-Csv "C:\Vishal\NsgRules.csv" -NoTypeInformation -Encoding ASCII -Append        
        }
    }
}

$nsg 包含 ResourceGroupNameName(网络安全组名称)。 $sub 包含订阅名称 Name

不确定这是否有帮助...我正在做类似的事情并使用 az cli(它可以直接转换为 powershell)

我正在采用这种方法:

#get all the subs in a list
$subs_list = az account list --query [].[id] -o tsv

#loop through list of subs
foreach($sub in $subs_list)
{
    az account set --subscription $sub # change the active sub
    $rg_list = az group list | ConvertFrom-json # retrieve a list of resource groups for that sub
    foreach($rg in $rg_list) # loop through the list of resource groups
    {
        $nsg_list = az network nsg list --resource-group $rg.name | ConvertFrom-json # get the list of nsg for a resource group
        foreach($nsg in $nsg_list) # loop through the list of nsg
        {
            $nsg_rules = az network nsg rule list --nsg $nsg.name --resource-group $rg.name -o table # get a list of rules for each nsg
            $nsg_rules # print the rules to screen
        }
        

    }
}

您必须弄清楚如何格式化它,但您现在通过 $rg.name 或 $rg.id 在 $sub 中拥有订阅对象,在 $rg 中拥有资源组。 ..

希望对您有所帮助,我也是新手,这是我在这里回答的第一个问题:)