2

我正在尝试创建一个 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        
        }
    }
}

我为上述脚本获取的输出 在此处输入图像描述

我还尝试在$nsgRule |下调用对象 Resourcegroup、SubscriptionName Select-Object它给了我空白列,标题为 Resourcegroup,subscriptionName。

我试图得到这样的输出:

在此处输入图像描述

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

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

4

2 回答 2

3

您要返回的额外属性属于与 不同的对象$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.

于 2021-01-14T16:28:31.127 回答
0

不确定这是否有帮助......我正在做类似的事情并使用 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 中的资源组...

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

于 2021-03-28T06:55:14.723 回答