我试图查找是否已存在具有相同名称、相同配置的防火墙规则,例如:localport。
所以我使用
Get-NetFirewallRule
列出所有规则,但是返回的规则不包含端口信息,还缺少一些其他信息。在哪里可以找到规则的所有配置。以下是返回的属性:
姓名 显示名称 描述 显示组 团体 启用 轮廓 平台 方向 行动 边缘遍历策略 松散源映射 仅本地映射 所有者 主要状态 地位 执行状态 策略存储源 PolicyStoreSourceType
我认为许多人(包括我最近)不理解的是,Get-NetFirewall*Filter 命令提供了搜索防火墙规则的快速快捷方式,就像其他命令中的 -filter 选项一样。如果我这样做,需要很长时间:
Get-NetFirewallRule | Get-NetFirewallPortFilter |
Where LocalPort -eq 3389
虽然这几乎是即时的:
Get-NetFirewallPortFilter | Where LocalPort -eq 3389
Get-NetFirewallPortFilter 实际上返回 InstanceID 属性中防火墙规则的名称,默认情况下不显示。这就是为什么您可以将 Get-NetFirewallPortFilter 通过管道返回到 Get-NetFirewallRule。
Get-NetFirewallPortFilter | Where LocalPort -eq 3389 |
Get-NetFirewallRule
这是一个提供类似于 netsh 的详细输出的函数,其中包含端口、地址和应用程序:
function mynetsh {
param($displayname)
$rule = get-netfirewallrule -displayname $displayname
$address = $rule | Get-NetFirewallAddressFilter
$port = $rule | Get-NetFirewallPortFilter
$application = $rule | Get-NetFirewallApplicationFilter
[pscustomobject]@{
DisplayName = $rule.DisplayName
Description = $rule.Description
Enabled = $rule.Enabled
Direction = $rule.Direction
Profile = $rule.Profile
DisplayGroup = $rule.DisplayGroup
LocalAddress = $address.LocalAddress
RemoteAddress = $address.RemoteAddress
Protocol = $port.Protocol
LocalPort = $port.LocalPort
RemotePort = $port.RemotePort
EdgeTraversalPolicy = $rule.EdgeTraversalPolicy
Program = $application.Program
Action = $rule.Action
}
}
mynetsh 'Remote Desktop - User Mode (TCP-In)'
DisplayName : Remote Desktop - User Mode (TCP-In)
Description : Inbound rule for the Remote Desktop service to allow RDP traffic. [TCP 3389]
Enabled : False
Direction : Inbound
Profile : Any
DisplayGroup : Remote Desktop
LocalAddress : Any
RemoteAddress : Any
Protocol : TCP
LocalPort : 3389
RemotePort : Any
EdgeTraversalPolicy : Block
Program : %SystemRoot%\system32\svchost.exe
Action : Allow
为了查找防火墙规则中已有的端口号,您可以使用不同的 cmdlet
Get-NetFirewallPortFilter
。
(信息)
使用
Get-NetFirewallRule
过滤您要查看的规则子集并将其通过管道传输到上述 cmdlet。例如:
Get-NetFirewallRule -DisplayName "SQL Broker Service" | Get-NetFirewallPortFilter
听起来您要找的房产是 localport。
使用以下命令列出所有内容。
Get-NetFirewallRule| Where { $_.Enabled -eq $True } |
Format-Table -Property Name,
DisplayName,
DisplayGroup,
@{Name='Protocol';Expression={($PSItem | Get-NetFirewallPortFilter).Protocol}},
@{Name='LocalPort';Expression={($PSItem | Get-NetFirewallPortFilter).LocalPort}},
@{Name='RemotePort';Expression={($PSItem | Get-NetFirewallPortFilter).RemotePort}},
@{Name='RemoteAddress';Expression={($PSItem | Get-NetFirewallAddressFilter).RemoteAddress}},
Enabled,
Profile,
Direction,
Action
使用 Select-Object Cmdlet 显示所有属性
这将仅显示第一个,这样您就不会被文本淹没,请根据需要随意删除“-First 1”
Get-NetFirewallRule | select -First 1 -Property *
然而,调查发现似乎没有有关端口的信息,进一步研究它 - 您可能需要使用 Get-NetFirewallPortFilter 并通过 instanceid 匹配它们。如果您需要帮助,我需要更多关于您想要实现的目标的信息。
如果您仅使用防火墙 cmdlet 来获取包括端口、程序等的对象列表,这不是一件容易的任务,而且速度非常慢!为什么不尝试传统的方法,即
netsh advfirewall firewall
命令套件。下面是我尝试获取包含所有规则信息的对象列表。
$output = (netsh advfirewall firewall show rule name=all verbose | Out-String).Trim() -split '\r?\n\s*\r?\n'
$propertyNames = [System.Collections.Generic.List[string]]::new()
$objects = @( $(foreach($section in $output ) {
$obj = @{}
foreach( $line in ($section -split '\r?\n') ) {
if( $line -match '^\-+$' ) { continue }
$name, $value = $line -split ':\s*', 2
$name = $name -replace " ", ""
$obj.$name = $value
if($propertyNames -notcontains $name) {
$propertyNames.Add( $name )
}
}
$obj
}) | % {
foreach( $prop in $propertyNames ) {
if( $_.Keys -notcontains $prop ) {
$_.$prop = $null
}
}
[PSCustomObject]$_
})