如何在PowerShell中获取非默认的Windows防火墙规则
我完全理解你的需求——想要精准区分Windows自带的默认防火墙规则和第三方程序创建的规则,用Get-NetFirewallRule | fl *确实很难一眼分辨出来。这里给你几个更可靠的方法,从最权威的属性判断到辅助验证都有:
1. 利用Origin属性(最推荐、最可靠)
Windows系统会给默认防火墙规则标记Origin属性为Default,而第三方程序创建、手动添加的规则,这个属性值通常是Local(也可能是Manual,取决于创建方式)。这是系统原生的标记,几乎不会被第三方程序篡改,是最准确的判断依据。
你可以用这条PowerShell命令直接筛选出非默认规则:
Get-NetFirewallRule | Where-Object { $_.Origin -ne "Default" } | Select-Object DisplayName, Origin, Direction, Enabled
这条命令会列出所有非默认规则的名称、来源、方向(入站/出站)和启用状态,方便你快速查看。
2. 结合Author属性辅助验证
默认规则的Author属性几乎都是Microsoft Corporation,而第三方程序创建的规则通常会标注软件厂商的名称,或者是自定义的作者信息。你可以用这条命令过滤:
Get-NetFirewallRule | Where-Object { $_.Author -ne "Microsoft Corporation" } | Select-Object DisplayName, Author, Program
不过这个方法有小概率例外——比如有些第三方程序可能会故意设置作者为微软,但这种情况非常少见,还是可以作为辅助判断的手段。
3. 结合你观察到的组名和程序路径特征
你提到的默认规则都有组名、程序路径多为%SystemRoot%\*或System的特征,确实可以作为补充筛选条件。比如这条命令:
Get-NetFirewallRule | Where-Object { (-not $_.Group) -or ($_.Program -notlike "%SystemRoot%*" -and $_.Program -ne "System" -and $_.Program -ne "SYSTEM") } | Select-Object DisplayName, Group, Program
它会过滤掉那些有明确组名且程序路径属于系统目录的规则,剩下的大概率是第三方创建的。不过要注意,少数第三方程序也可能给自己的规则添加组名,所以这个方法最好和前面的Origin判断结合使用。
总结一下,优先用Origin属性筛选,再配合Author、组名、程序路径这些特征交叉验证,就能精准找出所有非默认的防火墙规则啦。
备注:内容来源于stack exchange,提问作者user20682592

