您好,我需要查询多个远程服务器中的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)
1条答案
按热度按时间2admgd591#
看起来您需要修改
Where-Object
调用,以基于已有的表达式执行更细粒度的过滤,并进行一些更正:注意事项:
-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
。