如何通过 InstanceID 获取特定端口的防火墙规则名称

如何通过 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
}

此时没有任何结果。
发现InstanceIDwithin$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

相关内容