我正在尝试识别所有针对特定端口的防火墙规则。以下是我可以手动执行的操作:
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
within$InstanceIDs
不是字符串,但无法转换它。
有什么办法可以让它工作吗?
谢谢。
答案1
您的问题与$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
。