在实际的工作环境中,出于某种需要或特定条件的限制,同一个批处理脚本会要求在某些电脑上可以执行,在其它电脑上则不能执行。具体的判断条件可能有多种,例如计算机名、用户名、序列号、日期、时间、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
到此这篇关于批处理仅允许在指定电脑computername上执行的代码的文章就介绍到这了,更多相关批处理限制在指定电脑上才能执行内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论