常常手动设置防火墙的入站或出站规则,比较麻烦,其实可以用命令行搞定。
下面是禁用BCompare.exe连接网络的例子:
@ECHO OFF&(PUSHD "%~DP0")&(REG QUERY "HKU\S-1-5-19">NUL 2>&1)||(powershell -Command "Start-Process '%~dpnx0' -Verb RunAs"&&EXIT)rem %~sdpnx0 use short names
rem @ECHO OFF&(PUSHD "%~DP0")&(REG QUERY "HKU\S-1-5-19">NUL 2>&1)||(powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"&&EXIT)
rem %~dpnx0 use long names
rem @ECHO OFF&(PUSHD "%~DP0")&(REG QUERY "HKU\S-1-5-19">NUL 2>&1)||(powershell -Command "Start-Process '%~dpnx0' -Verb RunAs"&&EXIT)rem 获取当前脚本文件的完整路径,并切换到BCompare.exe程序所在的目录
set current_path=%~dp0
rem echo current_path=%current_path%rem 设置变量“xpath”的值为BCompare.exe程序的绝对路径
set xpath="%current_path%BCompare.exe"
rem echo xpath="%current_path%BCompare.exe"rem 删除之前可能存在的防火墙规则,并忽略错误信息
echo "删除-BCompare禁止联网-出站"
@netsh advfirewall firewall delete rule name="BCompare禁止联网-出站"
echo "删除-BCompare禁止联网-入站"
@netsh advfirewall firewall delete rule name="BCompare禁止联网-入站"rem 添加新的防火墙规则,禁止BCompare.exe程序的出站和入站网络流量
echo "添加,BCompare禁止联网-出站 规则"
netsh advfirewall firewall add rule name="BCompare禁止联网-出站" dir=out action=block profile=any program=%xpath% enable=yes
echo "添加,BCompare禁止联网-入站 规则"
netsh advfirewall firewall add rule name="BCompare禁止联网-入站" dir=in action=block profile=any program=%xpath% enable=yes
pause
命令add rule 解析
创建的规则类型
netsh advfirewall firewall add rule
接如下参数:
dir=in
: 还可选out
,in是入站(inbound)的。只适用于从外部网络向本地计算机发送的数据流量,也就是别人访问你的计算机的情况;out 只适用于出站(outbound)的网络流量,也就是从本地计算机向外部网络发送的数据。program="C:\xxx.exe"
protocol=tcp
: 还可选0-255|icmpv4|icmpv6|icmpv4:type,code|icmpv6:type,code|tcp|udp|any (default=any)
localip=any
:还可选<IPv4 address>|<IPv6 address>|<subnet>|<range>|<list>
localport=0-65535
:其他还有<port range>[,...]|RPC|RPC-EPMap|IPHTTPS|any (default=any)
action=allow
:还可选block|bypass
。规则允许(allow)这种网络流量通过防火墙,或阻止(block)或绕过(bypass)它。profile=any
:还可选public|private|domain|any[,...]
,所有(any)的防火墙配置文件,包括域(domain)、私有(private)和公共(public)。enable=yes
:还可选no
,(default=yes)表示这个规则yes启用(enable)的,而不是no禁用的。平时可以不写这一项。
例子:
添加,BCompare禁止联网-出站 规则
netsh advfirewall firewall add rule name="BCompare禁止联网-出站" dir=out action=block profile=any program=%xpath% enable=yes
添加,BCompare禁止联网-入站 规则
netsh advfirewall firewall add rule name="BCompare禁止联网-入站" dir=in action=block profile=any program=%xpath% enable=yes入站规则
netsh advfirewall firewall add rule name="My Application" dir=in action=allow program="C:\MyApp\MyApp.exe" enable=yes
出站规则
netsh advfirewall firewall add rule name="Remote PortNumber" dir=out action=allow protocol=TCP localport=1234
使用管理员方式运行bat
rem %~sdpnx0 use short names
@ECHO OFF&(PUSHD "%~DP0")&(REG QUERY "HKU\S-1-5-19">NUL 2>&1)||(powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"&&EXIT)rem %~dpnx0 use long names
@ECHO OFF&(PUSHD "%~DP0")&(REG QUERY "HKU\S-1-5-19">NUL 2>&1)||(powershell -Command "Start-Process '%~dpnx0' -Verb RunAs"&&EXIT)
命令是用来检测当前用户是否具有管理员权限,如果没有,就以管理员身份重新运行该脚本。具体的解释如下:
@ECHO OFF
表示关闭回显功能,不显示命令本身。(PUSHD "%~DP0")
表示将当前目录切换到批处理文件所在的目录,%~DP0
是一个参数扩展,表示批处理文件的驱动器和路径。(REG QUERY "HKU\S-1-5-19">NUL 2>&1)
表示查询注册表中的一个键值,这个键值是系统默认的管理员账户的SID。如果查询成功,说明当前用户具有管理员权限。>NUL 2>&1
表示将标准输出和错误输出都重定向到空设备,即不显示任何信息。||(powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"&&EXIT)
表示如果前面的命令失败,即当前用户不具有管理员权限,就执行后面的命令。后面的命令是用powershell来启动一个新的进程,这个进程就是当前的批处理文件,但是用短文件名代替长文件名,%~sdpnx0
是一个参数扩展,表示批处理文件的完整路径,但用短文件名格式。-Verb RunAs
表示以管理员身份运行这个进程。&&EXIT
表示如果成功启动了新的进程,就退出当前的进程。
想要修改这个脚本命令为长路径的几种办法,有几种可能的方法:
- 可以不使用短文件名格式,而直接使用长文件名格式。这样就可以把
%~sdpnx0
改为%~dpnx0
。 - 可以不使用powershell来启动新的进程,而使用runas命令。这样就可以把
(powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs")
改为(runas /user:administrator "%~sdpnx0")
。但是这种方法需要输入管理员账户的密码。 - 可以不使用reg query来检测管理员权限,而使用net session或者whoami命令。这样就可以把
(REG QUERY "HKU\S-1-5-19">NUL 2>&1)
改为(NET SESSION>NUL 2>&1)
或者(WHOAMI /GROUPS | FINDSTR /C:\"S-1-5-32-544\">NUL 2>&1)
。
(1) 批处理实战篇—修改文件变量、参数_bat 修改变量的值_BetaGarf的博客-CSDN博客. https://blog.csdn.net/Joker_N/article/details/90375203.
(2) .bat批处理命令常用操作大全 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/446337414.
(3) BAT批处理基本命令总结 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/54572985.