You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何快速批量删除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

火山引擎 最新活动