Назад | Перейти на главную страницу

Как получить имена правил межсетевого экрана по InstanceID, обращающимся к определенному порту

Я пытаюсь определить все правила брандмауэра, которые обращаются к определенному порту. Вот как я могу это сделать вручную:

Get-NetFirewallPortFilter | Where { $_.LocalPort -Eq "RPC" } `
| Format-Table -Property InstanceID

Теперь мне нужно знать название правила:

Show-NetFirewallRule | Where { $_.InstanceID –Eq “Netlogon-TCP-RPC-In”} `
| Format-Table -Property DisplayName

Тогда я получаю:

DisplayName
-----------
Netlogon Service Authz (RPC)

Я не хочу делать это вручную
Я пробовал следующий сценарий, чтобы получить список имен:

$InstanceIDs = Get-NetFirewallPortFilter | Where { $_.LocalPort -Eq "RPC" } `
| Format-Table -Property InstanceID
foreach ($InstanceID in $InstanceIDs)
{
    Show-NetFirewallRule | Where { $_.InstanceID –Eq $InstanceID} `
    | Format-Table -Property DisplayName
}

На данный момент ничего не получил.
Выяснили, что InstanceID в пределах $InstanceIDs не является строкой, но преобразовать ее не удалось.

Есть идеи, как заставить его работать?
Спасибо.

Ваша проблема как-то связана с $InstanceID тип (пытаться $InstanceID.Gettype() в вашем сценарии). Следующий фрагмент кода может помочь:

$InstanceIDs =  -split $( 
    Get-NetFirewallPortFilter | 
        Where { $_.LocalPort -Eq "RPC" } | 
            Format-Table -Property InstanceID -HideTableHeaders | 
                Out-String
    )

Show-NetFirewallRule | 
    Where { $_.InstanceID –In $InstanceIDs} |
        ForEach-Object { 
            if ($_.Name) {
                "{0} {1} {2}" -f $_.Name, '==', $_.DisplayName
            }
        }

Обратите внимание, что $InstanceIDs представляет собой массив строк в приведенном выше фрагменте кода; более того, $_.Name собственность в Show-NetFirewallRule соответствует InstanceID один в Get-NetFirewallPortFilter.