在实际的工作环境中,出于某种需要或特定条件的限制,同一个批处理脚本会要求在某些电脑上可以执行,在其它电脑上则不能执行。具体的判断条件可能有多种,例如计算机名、用户名、序列号、日期、时间、IP地址、MAC地址等。
本文的主要目的是演示几种不同的思路,实现通过判断计算机名来决定是否允许执行批处理脚本。不包含以下内容:
怎样防止bat脚本被篡改
怎样加密bat脚本
怎样把bat脚本转换成exe文件
方法1:写一大推 if 条件判断
test-1.bat
@echo off if /i "%computername%" equ "ZhangSan" ( goto :AuthPass ) else if /i "%computername%" equ "LiSi" ( goto :AuthPass ) else if /i "%computername%" equ "WangWu" ( goto :AuthPass ) else if /i "%computername%" equ "ZhaoLiu" ( goto :AuthPass ) else ( echo 不符合执行条件 pause goto :eof ) :AuthPass echo 符合执行条件 REM 业务代码放在下面 pause
这个方法的缺点是显而易见的,当允许执行的计算机名很多的时候,比如成百上千个计算机名都允许执行,那么这些if条件就显得非常臃肿,而且难以维护。
方法2:读取白名单的内容
把允许执行的计算机名称写入白名单文件 WhiteList.txt 每行一个计算机名,例如:
ZhanSan
LiSi
WangWu
ZhaoLiu
test-2-1.bat
使用 for 命令逐行判断白名单里面的字符串是否跟当前计算机名称相匹配。如果能找到匹配的行,则把自定义变量 AllowFlag 的值更改为 true ;如果找不到匹配的行,则自定义变量 AllowFlag 的值仍然保持为 false 不变。
@echo off set "AllowFlag=false" for /f "delims=" %%i in ('type "WhiteList.txt"') do ( if /i "%computername%" equ "%%i" ( set "AllowFlag=true" ) ) if "%AllowFlag%" equ "false" ( echo 不符合执行条件 pause goto :eof ) :AuthPass echo 符合执行条件 REM 业务代码放在下面 pause
test-2-2.bat
使用 findstr 命令判断能否在白名单里面找到当前计算机名称。如果能找到,则系统变量 errorlevel 的值为0;如果找不到,则系统变量 errorlevel 的值为1。
@echo off findstr /i /x "%computername%" "WhiteList.txt" >nul if errorlevel 1 ( echo 不符合执行条件 pause goto :eof ) :AuthPass echo 符合执行条件 REM 业务代码放在下面 pause
有的人喜欢这个方法,因为他们觉得维护 txt 文件比较方便。也有的人不喜欢这个方法,是因为除了 bat 文件之外还要有个txt文件,他们更加倾向于把白名单列表也放在 bat 文件里面,于是就有了下面的方法。
方法3:白名单放在bat文件内部
test-3.bat
@echo off for /f "delims=:" %%i in ('findstr /n /b /e ":AllowList" "%~f0"') do ( more +%%i "%~f0" > "%temp%\WhiteList.txt" ) findstr /i /x "%computername%" "%temp%\WhiteList.txt" >nul if errorlevel 1 ( echo 不符合执行条件 pause goto :eof ) :AuthPass echo 符合执行条件 REM 业务代码放在下面 pause goto :eof REM 白名单放在结尾 :AllowList ZhanSan LiSi WangWu ZhaoLiu
其它几个可以作为判断条件的信息:
用户名
%username%
日期
%date%
时间
%time%
主板BIOS序列号
wmic BIOS get SerialNumber /value wmic BASEBOARD get SerialNumber /value
硬盘序列号
wmic DISKDRIVE get SerialNumber /value wmic path Win32_PhysicalMedia get SerialNumber /value
批处理获取多网卡系统中指定网络连接对应的MAC地址和IP地址
@echo off REM 设置网络适配器的名称 set "AdapterName=以太网 2" set "FileTmp=%temp%\ipList.txt" ipconfig /all >"%FileTmp%" for /f "delims=:" %%i in ('findstr /n /c:"%AdapterName%" "%FileTmp%"') do ( set "SkipRow=%%i" goto :FindMAC ) :FindMAC for /f "tokens=2 delims=:" %%i in ('more +%SkipRow% "%FileTmp%" ^| findstr "..-..-..-..-..-.."') do ( set "MAC=%%i" goto :FindIP ) :FindIP for /f "tokens=2 delims=:(" %%i in ('more +%SkipRow% "%FileTmp%" ^| findstr /v "IPv6" ^| findstr "IP"') do ( set "IP=%%i" goto :ShowResult ) :ShowResult set "MAC=%MAC: =%" echo,%MAC% set "IP=%IP: =%" echo,%IP% pause