用于查询GPO上的端口的PowerShell脚本

3lxsmp7m  于 2022-11-29  发布在  Shell
关注(0)|答案(1)|浏览(151)

您好,我需要查询多个远程服务器中的FW GPO端口。在第一步,我构建了此查询,该查询应在本地检索信息,并计划将其作为.PS脚本添加到ScriptBlock中。我构建了一个查询,该查询集成了两个不同查询的结果。在第一个查询中,我放置了所需的筛选器,没有任何问题,但在第二个查询中,我遇到了问题。
以下是脚本:

Get-NetFirewallRule -Action Allow -Enabled True -Direction Inbound | Select-Object -Unique | Where-Object {$_.LocalPort -eq 7680}|
Format-Table -Property Profile,
Enabled,
Direction,
@{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}},
Profile

我有几个问题:
1.有人能告诉我如何过滤本地端口以及此查询中的端口范围吗?我尝试了很多次都没有成功(我们如何使用Where-Object来查询@{Name='Protocol';Expression={($PSItem | Get-NetFirewallPortFilter).Protocol}}之类的)
1.将使用netsh代替它是否更可取?
1.我们如何自定义结果并在AsBuiltReport框架中呈现结果?
谢谢Shai
我尝试修改where-object,但没有成功。它应该会返回行,其中

Action=Allow,
Enabled=True 
Direction=Inbound
and
($_.LocalPort -match '80|135|139|445|5985|5986' -or $_.LocalPort -ge 49152 -or $_.LocalPort -le 65535)
2admgd59

2admgd591#

看起来您需要修改Where-Object调用,以基于已有的表达式执行更细粒度的过滤,并进行一些更正:

Get-NetFirewallRule -Action Allow -Enabled True -Direction Inbound | 
  Where-Object { 
    $portFilter = $PSItem | Get-NetFirewallPortFilter
    $portFilter.LocalPort -match '^(80|135|139|445|5985|5986)$' -or 
      ($portFilter.LocalPort -ge 49152 -and $portFilter.LocalPort -le 65535)
  } |
  Format-Table Profile,
               Enabled,
               Direction,
               @{ Name='Protocol'; Expression={ $portFilter.Protocol } },
               @{ Name='LocalPort'; Expression={ $portFilter.LocalPort } },
               @{ Name='RemotePort'; Expression={ $portFilter.RemotePort } },
               @{ Name='RemoteAddress'; Expression={ ($PSItem | Get-NetFirewallAddressFilter).RemoteAddress } }

注意事项:

  • -match '80|135|139|445|5985|5986'已更改为-match '^(80|135|139|445|5985|5986)$',以确保端口号仅完全匹配 *,从而排除误报。
  • $_.LocalPort -ge 49152 -or $_.LocalPort -le 65535已更改为($portFilter.LocalPort -ge 49152 -and $portFilter.LocalPort -le 65535)(从-or更改为-and),因为我认为您希望在这两个数字之间匹配端口。
  • 由于变量$portFilter是在第二个Where-Object调用中定义的,因此Format-Table可以在其计算属性中使用$portFilter代替$PSItem | Get-NetFirewallPortFilter
  • 顺便说一句:在最初的Format-Table调用中,在每个calculated property的表达式中重复($PSItem | Get-NetFirewallPortFilter)调用,这是低效的;即使没有预先存在的变量,也可以将结果赋给第一个此类属性中的变量,然后在其余属性中使用该变量。
  • 和往常一样,Format-* cmdlet应该只用于生成 for-display 输出;如果以后需要 * 以编程方式处理 * 输出,请改用Select-Object
  • 如需详细信息,请参阅this answer

相关问题