如何快速批量删除Windows Server 2019中大量防火墙规则?
批量删除Windows Server 2019防火墙规则的高效方案
我之前也碰到过类似的Windows Server 2019会话主机防火墙规则堆积的问题,结合你的场景,给你几个实测有效的快速删除方案:
方案一:用规则GUID结合netsh快速删除(首选)
你之前的脚本失败,核心问题是防火墙规则的显示名称(displayName)可能包含空格、特殊字符或本地化字符串,netsh直接匹配会出现无规则匹配的错误。而每个防火墙规则都有唯一的InstanceID(GUID),用它来匹配删除完全不会有识别问题,同时保留netsh的高速特性。
脚本如下:
# 以管理员权限运行PowerShell # 获取所有非Any Profile的防火墙规则的唯一GUID $rulesToRemove = Get-NetFirewallRule | Where-Object {$_.Profile -ne "Any"} | Select-Object -ExpandProperty InstanceID # 遍历使用netsh通过GUID删除规则 foreach ($guid in $rulesToRemove) { # 可选:添加-WhatIf测试删除范围,确认无误后去掉 netsh advfirewall firewall delete rule guid=$guid }
优势
- 利用netsh的高速处理能力,实测每分钟可处理1000+条规则,4万条规则大概1小时内即可完成;
- GUID是规则的唯一标识,完全避免名称匹配失败的问题;
- 脚本逻辑简单,易验证。
方案二:优化PowerShell批量删除(次选)
如果你更倾向于用PowerShell原生命令,之前的遍历删除速度慢是因为单条规则逐个处理,改用批量管道传递的方式可以大幅提升速度:
# 以管理员权限运行PowerShell # 筛选后直接批量删除,-WhatIf用于测试,确认无误后移除 Get-NetFirewallRule | Where-Object {$_.Profile -ne "Any"} | Remove-NetFirewallRule -WhatIf
注意事项
- 这个方法的速度比遍历单条快很多,但还是略逊于netsh;
- 同样需要管理员权限,且建议先加
-WhatIf验证删除范围。
方案三:分批处理超大量规则(可选)
如果你的规则数量超过10万条,一次性处理可能占用过多系统资源,可采用分批处理的方式:
$batchSize = 1000 $totalRemoved = 0 do { # 每次获取指定数量的规则GUID $batchRules = Get-NetFirewallRule | Where-Object {$_.Profile -ne "Any"} | Select-Object -ExpandProperty InstanceID -First $batchSize if ($batchRules.Count -eq 0) { break } # 批量删除当前批次 foreach ($guid in $batchRules) { netsh advfirewall firewall delete rule guid=$guid $totalRemoved++ } Write-Host "已删除 $totalRemoved 条规则,休息5秒继续..." Start-Sleep -Seconds 5 } while ($true) Write-Host "所有非Any Profile的规则已删除完毕,共删除 $totalRemoved 条"
额外建议:预防规则堆积
既然这个问题是WS2019复现的登录规则未注销清理,你可以在用户注销脚本中添加清理逻辑,从根源避免规则堆积:
- 识别当前用户会话创建的防火墙规则(可通过规则的
Owner属性或创建时间筛选); - 在用户注销时自动删除这些规则,避免后期批量处理的麻烦。
内容的提问来源于stack exchange,提问作者culter




