前言

配置禁止某个程序联网的需求是非常常见的,比如担心某个软件泄密,或者嫌某个软件广告太多。

这里我直接用了Quicker写好的程序去完成我的目的:防火墙规则修改 - by Suuc_Air - 动作信息 - Quicker

使用方式很简单,选择某个exe(如果什么都不选就会默认选择前台的程序),然后选择某个操作,然后就可以了。支持的操作列表如下:

在这里插入图片描述

例如我什么都不选,点击禁止出站,就会默认把我前台的EV录屏给禁止出战:
在这里插入图片描述

为了探索其背后的原理,保证这个脚本本身没有问题,考虑到脚本制作者本人没有写,只是简单地留了一个参考链接Use netsh advfirewall firewall context - Windows Server | Microsoft Learn,我这里写一个简单的博客。

具体原理

由于脚本比较长,长文本处理Kimi会好很多,deepseek容易截断,所以以下具体原理采用Kimi生成。

脚本名称:防火墙规则修改器

功能及效果

1. 添加“禁止出站”规则
输入:用户手动选择若干可执行文件(.exe 或快捷方式 .lnk)。
运行指令:netsh advfirewall firewall add rule name="文件名_完整路径" dir=out program="完整路径" action=block
效果:阻止指定程序主动向外网发起任何连接。

2. 添加“禁止入站”规则
输入:同上。
运行指令:与“禁止出站”相同,仅将 dir 参数改为 in
效果:阻止外网主机主动连接到本机指定程序监听的端口。

3. 添加“允许出站”规则
输入:同上。
运行指令:把 action 改为 allow,其余与功能 1 一致。
效果:显式放行指定程序的所有出站连接,优先级高于默认规则。

4. 添加“允许入站”规则
输入:同上。
运行指令:把 dir 改为 inaction 改为 allow
效果:显式放行指定程序的所有入站连接,常用于服务器场景。

5. 打开“高级防火墙”图形界面
输入:无。
运行指令:wf.msc
效果:直接弹出 Windows 高级安全防火墙管理控制台,供高级用户手工调整规则。

6. 打开“防火墙控制面板”
输入:无。
运行指令:firewall.cpl
效果:调出系统防火墙主面板,便于查看总体状态和常规开关。

7. 一键启用系统防火墙
输入:无。
运行指令:netsh advfirewall set currentprofile state on
效果:立即为当前网络配置文件(域/专用/公用)启用防火墙,并随后打开防火墙控制面板确认状态。

8. 一键禁用系统防火墙(慎用)
输入:无。
运行指令:netsh advfirewall set currentprofile state off
效果:彻底关闭当前配置文件的防火墙;脚本会再次打开控制面板供用户二次确认。

9. 删除已添加的自定义规则
输入:用户再次选中先前处理过的可执行文件。
运行指令:netsh advfirewall firewall delete rule name="文件名_完整路径"
效果:仅移除由本脚本创建、且规则名称严格匹配“文件名_完整路径”的条目,不影响其他规则。

10. 查询已添加的自定义规则
输入:用户选中任意可执行文件。
运行指令:netsh advfirewall firewall show rule name="文件名_完整路径"
效果:在命令行窗口列出匹配名称的详细规则信息,便于核对设置是否正确。

功能及完整指令

十个功能对应的完整指令清单
(按功能编号列出,顺序固定;每行即脚本实际写入临时批处理并一次性执行的命令)


功能 1:禁止出站

  1. netsh advfirewall set currentprofile state on
  2. netsh advfirewall firewall add rule name="{文件名}_{完整路径}" dir=out program="{完整路径}" action=block
    —— 对所选每个 exe 重复第 2 条
  3. netsh advfirewall firewall show rule name="{文件名}_{完整路径}"
    —— 对所选每个 exe 重复第 3 条(用于立即回显结果)

功能 2:禁止入站

  1. netsh advfirewall set currentprofile state on
  2. netsh advfirewall firewall add rule name="{文件名}_{完整路径}" dir=in program="{完整路径}" action=block
    —— 对所选每个 exe 重复第 2 条
  3. netsh advfirewall firewall show rule name="{文件名}_{完整路径}"
    —— 对所选每个 exe 重复第 3 条

功能 3:允许出站

  1. netsh advfirewall set currentprofile state on
  2. netsh advfirewall firewall add rule name="{文件名}_{完整路径}" dir=out program="{完整路径}" action=allow
    —— 对所选每个 exe 重复第 2 条
  3. netsh advfirewall firewall show rule name="{文件名}_{完整路径}"
    —— 对所选每个 exe 重复第 3 条

功能 4:允许入站

  1. netsh advfirewall set currentprofile state on
  2. netsh advfirewall firewall add rule name="{文件名}_{完整路径}" dir=in program="{完整路径}" action=allow
    —— 对所选每个 exe 重复第 2 条
  3. netsh advfirewall firewall show rule name="{文件名}_{完整路径}"
    —— 对所选每个 exe 重复第 3 条

功能 5:打开高级防火墙设置
仅执行:

  • wf.msc

功能 6:打开防火墙控制面板
仅执行:

  • firewall.cpl

功能 7:启用系统防火墙

  1. netsh advfirewall set currentprofile state on
  2. firewall.cpl

功能 8:禁用系统防火墙

  1. netsh advfirewall set currentprofile state off
  2. firewall.cpl

功能 9:删除已添加的自定义规则

  1. netsh advfirewall firewall delete rule name="{文件名}_{完整路径}"
    —— 对所选每个 exe 重复第 1 条

功能 10:查询已添加的自定义规则

  1. netsh advfirewall firewall show rule name="{文件名}_{完整路径}"
    —— 对所选每个 exe 重复第 1 条

说明

  • 占位符 {文件名}_{完整路径} 由脚本根据实际路径动态生成,确保规则名唯一。
  • 功能 1–4 在添加规则前都会先执行 netsh advfirewall set currentprofile state on,目的是确保防火墙处于启用状态,防止规则写入失败。

简要运行原理

脚本运行总览:从启动到收尾的全流程

1. 功能执行前:环境与输入准备

  • 捕获输入
    脚本首先调用 sys:getSelectedFilessys:getActiveProcessInfo,把用户选中的文件路径或当前前台进程的可执行文件路径写入变量 files_paths_list
  • 文件过滤与解析
    通过正则把 .exe.lnk 分离;若存在 .lnk,则用 VBScript 读取快捷方式指向的真实路径,再与 .exe 合并、去重,最终得到 exe_files_paths_list
  • 用户确认
    弹窗让用户从 10 个功能里单选;若功能编号 ≤ 3 或 8、9,还会再弹一次确认框,展示要处理的程序清单,确保“先知情后操作”。

2. 功能执行中:指令生成与下发

  • 生成命令列表
    子程序“生成命令列表”遍历 exe_files_paths_list,为每个文件构造一条 netsh advfirewall firewall 命令,参数 name 固定为“文件名_完整路径”,确保后续可精准定位。
  • 写入临时批处理
    子程序“执行命令列表”把生成的命令写入一个随机命名的 *.bat,并在末尾加 pause,随后以管理员身份 (runas=1) 启动该批处理。
  • 结果回显
    批处理执行后,窗口保持打开,用户可立即查看 netsh 返回的“成功/失败”提示;脚本通过 sys:notify 再给出统一弹窗反馈。

3. 功能执行后:收尾与扩展入口

  • 成功分支
    若返回码为 0,脚本弹出“命令成功执行”提示;紧接着提供一个二次选择菜单,允许用户:
    ① 打开 wf.msc 再次人工核查;
    ② 打开 firewall.cpl 查看总体状态;
    ③ 列出本次被忽略的非 .exe 文件;
    ④ 直接删除刚刚添加的规则(反向回滚)。
  • 失败分支
    若批处理因权限或语法问题报错,脚本立即弹出“可能缺少管理员权限”警告,并用 forcestop 终止自身,避免留下不完整或错误的规则。
  • 现场清理
    临时批处理文件在退出时由系统默认删除,不残留任何中间文件;所有变量恢复初始状态,等待下一次调用。

微软官方文档的翻译

官方文档:Use netsh advfirewall firewall context - Windows Server | Microsoft Learn
如果不准翻译可联系我删除。
Kimi直接翻译的。表格由于Markdown自动识别有不准确,所以有部分错位的现象,我懒得调整了。

使用 netsh advfirewall firewall 而非 netsh firewall 来控制 Windows 防火墙行为

本文介绍如何改用 netsh advfirewall firewall 上下文,而不再使用 netsh firewall 上下文来控制 Windows 防火墙行为。

_原始 KB 编号:_947709

摘要

netsh advfirewall firewall 命令行上下文在 Windows Server 2012 R2 中已提供。该上下文不仅具备 netsh firewall 防火墙上下文所提供的全部 Windows 防火墙控制功能,还能更精细地管理防火墙规则,支持按以下配置文件分别设置:

  • 域 (Domain)
  • 专用 (Private)
  • 公用 (Public)

netsh firewall 命令行上下文可能在未来版本的 Windows 操作系统中被弃用。建议改用 netsh advfirewall firewall 上下文来控制防火墙行为。

重要提示
如果你的帐户属于 Administrators 组,且计算机已启用用户帐户控制 (UAC),请使用提升权限的命令提示符运行命令。方法:找到用于启动命令提示符的图标或“开始”菜单项,右键单击并选择 以管理员身份运行

以下表格提供了常用命令示例,可帮助你从旧的 netsh firewall 上下文迁移到新的 netsh advfirewall firewall 上下文。
此外,还列出了可用于获取详细联机帮助的 netsh advfirewall 命令。

命令示例 1:允许程序通过防火墙

旧命令 新命令
netsh firewall add allowedprogram C:\MyApp\MyApp.exe "My Application" ENABLE netsh advfirewall firewall add rule name="My Application" dir=in action=allow program="C:\MyApp\MyApp.exe" enable=yes
netsh firewall add allowedprogram program=C:\MyApp\MyApp.exe name="My Application" mode=ENABLE scope=CUSTOM addresses=157.60.0.1,172.16.0.0/16,LocalSubnet profile=Domain netsh advfirewall firewall add rule name="My Application" dir=in action=allow program="C:\MyApp\MyApp.exe" enable=yes remoteip=157.60.0.1,172.16.0.0/16,LocalSubnet profile=domain
netsh firewall add allowedprogram program=C:\MyApp\MyApp.exe name="My Application" mode=ENABLE scope=CUSTOM addresses=157.60.0.1,172.16.0.0/16,LocalSubnet profile=ALL 依次执行以下命令:
netsh advfirewall firewall add rule name="My Application" dir=in action=allow program="C:\MyApp\MyApp.exe" enable=yes remoteip=157.60.0.1,172.16.0.0/16,LocalSubnet profile=domain
netsh advfirewall firewall add rule name="My Application" dir=in action=allow program="C:\MyApp\MyApp.exe" enable=yes remoteip=157.60.0.1,172.16.0.0/16,LocalSubnet profile=private

如需了解如何添加防火墙规则的更多信息,请运行:

netsh advfirewall firewall add rule ?

命令示例 2:开放端口

旧命令 新命令
netsh firewall add portopening TCP 80 "Open Port 80" netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80

如需了解如何添加防火墙规则的更多信息,请运行:

netsh advfirewall firewall add rule ?

命令示例 3:删除已允许的程序或端口

旧命令 新命令
netsh firewall delete allowedprogram C:\MyApp\MyApp.exe netsh advfirewall firewall delete rule name=规则名称 program="C:\MyApp\MyApp.exe"
delete portopening protocol=UDP port=500 netsh advfirewall firewall delete rule name=规则名称 protocol=udp localport=500

如需了解如何删除防火墙规则的更多信息,请运行:

netsh advfirewall firewall delete rule ?

命令示例 4:配置 ICMP 设置

旧命令 新命令
netsh firewall set icmpsetting 8 netsh advfirewall firewall add rule name="ICMP Allow incoming V4 echo request" protocol=icmpv4:8,any dir=in action=allow
netsh firewall set icmpsetting type=ALL mode=enable netsh advfirewall firewall add rule name="All ICMP V4" protocol=icmpv4:any,any dir=in action=allow
netsh firewall set icmpsetting 13 disable all netsh advfirewall firewall add rule name="Block Type 13 ICMP V4" protocol=icmpv4:13,any dir=in action=block

如需了解如何配置 ICMP 设置的更多信息,请运行:

netsh advfirewall firewall add rule ?

命令示例 5:设置日志

旧命令 新命令
netsh firewall set logging %systemroot%\system32\LogFiles\Firewall\pfirewall.log 4096 ENABLE ENABLE 依次执行以下命令:
netsh advfirewall set currentprofile logging filename %systemroot%\system32\LogFiles\Firewall\pfirewall.log
netsh advfirewall set currentprofile logging maxfilesize 4096
netsh advfirewall set currentprofile logging droppedconnections enable
netsh advfirewall set currentprofile logging allowedconnections enable

如需更多信息,请运行:

netsh advfirewall set currentprofile ?

若要为特定配置文件设置日志,请将 currentprofile 替换为以下任一选项:

  • domainprofile
  • privateprofile
  • publicprofile

命令示例 6:启用 Windows 防火墙

旧命令 新命令
netsh firewall set opmode ENABLE netsh advfirewall set currentprofile state on
netsh firewall set opmode mode=ENABLE exceptions=enable 依次执行以下命令:
netsh advfirewall set currentprofile state on
netsh advfirewall set currentprofile firewallpolicy blockinboundalways,allowoutbound
netsh firewall set opmode mode=enable exceptions=disable profile=domain 依次执行以下命令:
netsh advfirewall set domainprofile state on
netsh advfirewall set domainprofile firewallpolicy blockinbound,allowoutbound
netsh firewall set opmode mode=enable profile=ALL 依次执行以下命令:
netsh advfirewall set domainprofile state on
netsh advfirewall set privateprofile state on

如需更多信息,请运行:

netsh advfirewall set currentprofile ?

若要为特定配置文件设置防火墙状态,请将 currentprofile 替换为以下任一选项:

  • domainprofile
  • privateprofile
  • publicprofile

命令示例 7:还原默认策略

旧命令 新命令
netsh firewall reset netsh advfirewall reset

如需更多信息,请运行:

netsh advfirewall reset ?

命令示例 8:启用特定服务

旧命令 新命令
netsh firewall set service FileAndPrint netsh advfirewall firewall set rule group="文件和打印机共享" new enable=Yes
netsh firewall set service RemoteDesktop enable netsh advfirewall firewall set rule group="远程桌面" new enable=Yes
netsh firewall set service RemoteDesktop enable profile=ALL 依次执行以下命令:
netsh advfirewall firewall set rule group="remote desktop" new enable=Yes profile=domain
netsh advfirewall firewall set rule group="remote desktop" new enable=Yes profile=private

本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.csdn.net/article/details/150769578。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐