Я пытаюсь определить все правила брандмауэра, которые обращаются к определенному порту. Вот как я могу это сделать вручную:
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
.