问题描述
我有12台服务器(会话主机),每个服务器上都有成千上万的防火墙规则。在用户登录时会创建规则,而在注销时系统不会删除规则(可能是WS2016中修复的错误,但在2019年再次出现)。
我试图用powershell的 Remove-NetFirewallRule 删除规则,但是由于性能原因,它没有用。删除40k条规则(每分钟20条规则)需要33个小时。现在,我正在尝试使用netsh.exe(更快的规则)(每分钟1000条规则)来实现它,但是我无法找到如何在配置文件中过滤掉“ Any”规则(这些我想保留)。
我尝试使用powershell过滤规则,然后将其推送到netsh:
$rulesToRemove = Get-NetFirewallRule | where {$_.profile -ne "Any"} | select displayName
foreach($rule in $rulesToRemove) { netsh advfirewall firewall delete rule name=$rule }
,它适用于某些规则,而不适用于其他规则-“没有规则符合特定条件”。我尝试推送displayName,name和其他几个值,但是大多数规则根本不符合条件。这里唯一的条件是fw规则名称,因此我尝试使用netsh来获取名称,例如,我得到了类似的内容:
@ {Microsoft.Windows.Cortana_1.11.6.17763_neutral_neutral_cw5n1h2txyewy?mc-resource://Microsoft.Windows.Cortana/resources/PackageDisplayName}
甚至对于netsh都不起作用,因为它是规则名称:(。
问题:有没有办法在合理的时间内通过脚本删除成千上万的FW规则?
解决方法
就像Bill_Stewart所说的那样,您也可以点引用它。
$rulesToRemove = (Get-NetFirewallRule | where {$_.profile -eq "Any"}).DisplayName
foreach($rule in $rulesToRemove) { netsh advfirewall firewall delete rule name=$rule }