批处理仅允许在指定电脑computername上执行的代码

寻技术 其他编程 2023年07月28日 127

在实际的工作环境中,出于某种需要或特定条件的限制,同一个批处理脚本会要求在某些电脑上可以执行,在其它电脑上则不能执行。具体的判断条件可能有多种,例如计算机名、用户名、序列号、日期、时间、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
关闭

用微信“扫一扫”