powershell 为什么Get-NetFirewallRule不显示防火墙规则的所有信息?

qij5mzcb  于 2023-01-05  发布在  Shell
关注(0)|答案(5)|浏览(229)

我正在尝试查找是否已存在名称相同、配置相同的防火墙规则,例如:本地端口。
所以我使用Get-NetFirewallRule来列出所有规则,但是返回的规则不包含端口信息,也缺少一些其他信息。我在哪里可以找到一个规则的所有配置。下面是返回的属性:

Name
DisplayName
Description
DisplayGroup
Group
Enabled
Profile
Platform
Direction
Action
EdgeTraversalPolicy
LooseSourceMapping
LocalOnlyMapping
Owner
PrimaryStatus
Status
EnforcementStatus
PolicyStoreSource
PolicyStoreSourceType
ffscu2ro

ffscu2ro1#

我认为许多人(包括我最近)不理解的是,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
k4aesqcs

k4aesqcs2#

要查找防火墙规则中已存在的端口号,可以使用其他cmdlet Get-NetFirewallPortFilter
Info
使用Get-NetFirewallRule筛选要查看的规则子集,并将其通过管道传输到上述cmdlet。例如:

Get-NetFirewallRule -DisplayName "SQL Broker Service" | Get-NetFirewallPortFilter

听起来你要找的是本地港口。

oxalkeyp

oxalkeyp3#

使用以下命令列出全部。

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

输出如下所示

fruv7luv

fruv7luv4#

使用Select-Object Cmdlet显示所有属性
这将只显示第一个,所以你不会得到淹没与文本,随时删除“-第一个1”的需要

Get-NetFirewallRule | select -First 1 -Property *

然而,调查它似乎没有关于端口的信息,进一步研究它-您可能需要使用Get-NetFirewallPortFilter并通过instanceid匹配它们。如果您需要帮助,我将需要关于您正在尝试完成的事情的多一点信息。

pu3pd22g

pu3pd22g5#

如果你只使用防火墙小命令来获取包括端口、程序等的对象列表,这不是一件容易的事情,而且速度非常慢!为什么不试试老方法,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]$_
})

相关问题