如何使用netsh使用模式查找规则


10

我想知道微软中是否有人曾经不记得规则名称!
netsh advfirewall firewall show rule只接受1名,没有模式匹配设施,可在netsh的,以帮助使用图案像发现一个规律"SQL*"^SQL.+$
使用节目,name=all就可以列出所有的规则,但我无法找到一个Windows的实命令行grep的工具。

我希望能够运行这样的命令:

netsh advfirewall firewall show rule name=sql*

这可能吗?


1
一个快速的答案是:netsh advfirewall firewall show rule name=all | find "SQL"; 但是输出和控制效果不如预期。这非常混乱,甚至更糟,区分大小写……
阿喀琉斯(Achilles)


使用Powershell是另一种选择。是。但是如果要在远程计算机上执行此操作怎么办?是否可以让PS的远程端口保持打开状态,并使IDS / IPS像BvSsshServer一样?我正在寻找Windows的本机命令提示符中的可用内容。
阿喀琉斯(Achilles)2012年


我发现使用/Iwith FIND命令可以避免区分大小写的问题。但是结果仍然是混乱的……
阿基里斯

Answers:


10

在PowerShell中运行:

$fw=New-object -comObject HNetCfg.FwPolicy2    
$fw.rules | findstr /i "whaturlookingfor"

更好的是:

$fw.rules | select name | select-string "sql"

1
$ fw.rules | where-object {$ _。Enabled -eq $ true -and $ _。Direction -eq 1}帮助我达到了此目的(启用了入站)。
2014年

1
此外,您只能选择规则的某些属性。 $fw.Rules | where-object {$_.Enabled -eq $true -and $_.Direction -eq 1} | Select-Object -property name, direction, enabled
丹·普里兹

1
我很困惑,这是否意味着要在netsh提示符下运行?还是其他环境?
jjxtra 2015年

它必须在PowerShell提示符下运行,或者作为PowerShell(.ps1)脚本的一部分运行。New-Object是PowerShell cmdlet,可在保留PowerShell语法和对象结构的同时提供对较旧的COM API的访问。
BaseZen

4

这是我所能做的最好的。有人知道如何进一步吗?喜欢从结果中删除/减去规则名称吗?

netsh advfirewall firewall show rule name=all | find "Rule Name:" | find "NameLookingFor"

3

在Windows 10上,我在执行时收到警告netsh advfirewall,说将来的Windows版本可能不再支持该功能,因此应该改用PowerShell。幸运的是,OP想要做的事情在PowerShell中很容易:

Get-NetFirewallRule -DisplayName "SQL*"

我有1000多个防火墙规则,这些规则由我要删除的随机命名的可执行文件创建。使用以下命令可以轻松完成此操作:

Remove-NetFirewallRule -DisplayName "*mongod.exe"


2

您可以尝试Select-String

netsh advfirewall firewall show rule name=all | select-string -pattern "Hyper-V"

1
请不要在未确认您处于此解决方案所需的条件下进行投票。
Loul G.

1

如果没有PowerShell,您可以将regex与findstr一起使用:

netsh advfirewall firewall show rule name=all | findstr /R "sql.*"

0

诚然,这是一个简单的答案,但评论会掩盖这一点。

当然,这也回答了一个稍有不同的问题:我怎么使用netsh并且仍然找到规则?:-)

我认为最好还是保留PowerShell惯用语,并且可以使用完整的模式匹配功能,包括其中的正则表达式。

为此,我加入了一些条件和变异,以说明所有PowerShell构造如何可嵌入到功能样式块中。

最后的警告是,突变必须以管理权限运行,而无需读取。

(New-Object -ComObject HNetCfg.FwPolicy2).rules |
    Where-Object { $_.Name -match '^SQL.+$' } |
    ForEach-Object { Write-Output "Checking $($_.Name)"
      if ( $_.Enabled ) { Write-Output "$($_.Name) already enabled" }
      else { Write-Output "$($_.Name) enabled"; $_.Enabled = $true }
    }                                                              
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.