常常手動設置防火墻的入站或出站規則,比較麻煩,其實可以用命令行搞定。
下面是禁用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.