Как я могу перечислить все входящие правила для всех виртуальных машин в моей подписке с помощью powershell?

#azure #powershell #azure-virtual-machine

#azure #powershell #azure-virtual-machine

Вопрос:

Я хочу перечислить все порты во входящих правилах, которые открыты для виртуальной машины с помощью powershell.

Я обнаружил, что группы сетевой безопасности либо подключены к сетевой карте, либо к виртуальным сетям.

Кто-нибудь может поделиться сценарием, в котором я могу видеть входящие правила для виртуальной машины с помощью powershell?

Комментарии:

1. Вы имеете в виду входящие порты в брандмауэре внутри виртуальной машины?

2. Не внутри виртуальной машины. Я имею в виду входящие правила NSG.

Ответ №1:

Попробуйте выполнить команду, как показано ниже, $rule это то, что вы хотите, вы можете проверить $rule.Name .

 $rgs = (Get-AzResourceGroup).ResourceGroupName
foreach($rg in $rgs){

  $vms = (Get-AzVM -ResourceGroupName $rg).Name

  foreach($vm in $vms){

    $nicname = ((Get-AzVM -ResourceGroupName $rg -Name $vm).NetworkProfile.NetworkInterfaces.Id -split"/")[8]

    $nic = Get-AzResource -ResourceGroupName $rg -ResourceType Microsoft.Network/networkInterfaces -ResourceName "$nicname" -ApiVersion 2018-07-01
    $nsgnic = ($nic.properties.networkSecurityGroup.id -split"/")[8]

    $rulenic = (Get-AzNetworkSecurityGroup -ResourceGroupName $rg -Name $nsgnic).SecurityRules
    $ruledefault = (Get-AzNetworkSecurityGroup -ResourceGroupName $rg -Name $nsgnic).DefaultSecurityRules | Where-Object {$_.Direction -eq 'Inbound'}
    $rulenic1 = $rulenic   $ruledefault 


    $vnetname = (Get-AzNetworkInterface -ResourceGroupName $rg -Name $nicname).IpConfigurations.Subnet.Id.Split("/")[8]
    $subname = (Get-AzNetworkInterface -ResourceGroupName $rg -Name $nicname).IpConfigurations.Subnet.Id.Split("/")[10]



    $subnet = Get-AzResource -ResourceGroupName $rg -ResourceType Microsoft.Network/virtualNetworks/subnets -ResourceName "$vnetname/$subname" -ApiVersion 2018-07-01
    $nsgsub = ($subnet.properties.networkSecurityGroup.id -split"/")[8]
    $rulesub = (Get-AzNetworkSecurityGroup -ResourceGroupName $rg -Name $nsgsub).SecurityRules
    $ruledefault1 = (Get-AzNetworkSecurityGroup -ResourceGroupName $rg -Name $nsgsub).DefaultSecurityRules | Where-Object {$_.Direction -eq 'Inbound'}
    $rulsub1 = $rulesub   $ruledefault1


    $rule = $rulenic1   $rulsub1
    Write-Output $rule.Name

  }


}
 

Я тестирую его в одной группе ресурсов для всей подписки, просто добавьте цикл, как указано выше.

введите описание изображения здесь

Комментарии:

1. Скрипт пытается выполнить некоторые нулевые значения. Ошибка получения для той же Get-AzureRmNetworkSecurityGroup: не удается проверить аргумент для параметра ‘Name’. Аргумент имеет значение null или empty. Укажите аргумент, который не является нулевым или пустым, а затем повторите попытку выполнения команды. В строке:13 символ:78

2. Также получаю неверный вывод для некоторых экземпляров.

3. @TusharRaichand Есть ли в подсети виртуальной машины nsg? Мой пример предназначен для NSG, подключенных к сетевой карте и подсети, если в подсети нет nsg, $rulenic1 это результат, добавлять который не нужно $rulsub1 .

4. У него может быть или не быть NSG.

5. @TusharRaichand Я проигнорировал этот момент, вы могли бы просто добавить if оператор, чтобы оценить $nsgsub , если null, пропустите, у меня сейчас нет компьютера для тестирования, вы могли бы попробовать сначала, это должно сработать.