为何PowerShell枚举Windows防火墙规则速度慢?求高效方案
更快获取Windows入站启用防火墙规则及端口过滤器的方法
问题分析
原代码执行缓慢的核心原因是:通过管道逐个将Get-NetFirewallRule的结果传递给Get-NetFirewallPortFilter,这会触发多次独立的WMI/CIM查询,累加了大量调用开销。直接通过CIM关联查询可以一次性拉取所需数据,大幅提升效率。
优化实现代码
以下代码通过Get-CimInstance直接关联防火墙规则与端口过滤器类,仅需一次查询即可获取目标数据,且普通用户账户默认拥有读取权限:
Measure-Command { $firewallData = Get-CimInstance -ClassName MSFT_NetFirewallRule -Filter "Enabled='True' AND Direction='Inbound'" | Join-CimInstance -ClassName MSFT_NetFirewallPortFilter -On RuleName } # 如需查看具体规则信息,可执行: # $firewallData | Select-Object DisplayName, Protocol, LocalPort, RemotePort
效率提升原因
- 一次性完成关联查询,避免了管道中逐个规则调用
Get-NetFirewallPortFilter的多次查询开销 - 直接调用CIM类查询,减少了NetSecurity模块cmdlet的包装层额外消耗
耗时验证
使用该方法,执行耗时通常会降至1秒以内(具体时长取决于系统中防火墙规则总数),远低于原方法的6秒+耗时。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

