IT运维的365天--028 批处理自行检测并以管理员权限运行
好久没更新了,懒鬼一个:
经常下载绿色软件的朋友们应该都知道,在很多绿色软件的目录下会有一个“绿化.bat”的可执行文件,大部分人不是正经IT,才不管里面是啥,双击运行就是了。
但正经IT肯定要搞清楚它在干啥了,避免被下套了。。所以今天就来聊聊常见的第一段"获取管理员权限运行批处理自身"
废话不多说,展示代码:
@ECHO OFF & PUSHD "%CD%"&& CD /D "%~dp0"NUL 2>&1 REG.exe query "HKU\S-1-5-19" || (
ECHO SET UAC = CreateObject^("Shell.Application"^) > "%TEMP%\Getadmin.vbs"
ECHO UAC.ShellExecute "%~f0", "%1", "", "runas", 1 >> "%TEMP%\Getadmin.vbs"
"%TEMP%\Getadmin.vbs"
DEL /f /q "%TEMP%\Getadmin.vbs" 2>NUL
Exit /b
)
接下来我们一一解释里面这些都啥意思:
整段批处理脚本的主要目的是 以管理员权限重新运行自身。 简单来说,如果当前用户权限不足(例如,不是管理员),脚本会自动请求管理员权限,并以管理员身份再次运行。
逐行解析:
@ECHO OFF & PUSHD "%CD%"&& CD /D "%~dp0":
@:屏蔽当前行的回显,也就是不让这行命令显示在控制台上。
ECHO OFF: 关闭命令回显功能。 之后执行的命令,默认都不会显示在控制台上。
& PUSHD "%CD%":
&: 连接两个命令,先执行 ECHO OFF ,然后执行 PUSHD "%CD%"
PUSHD "%CD%": 保存当前目录 (current directory) 到一个“目录栈”中,供以后用 POPD 命令恢复。 %CD% 是一个环境变量,表示当前的目录。 这行命令通常是为了确保脚本执行完毕后,能回到脚本运行前的目录。
&& CD /D "%~dp0":
&&:连接两个命令,只有当前面的命令执行成功(返回码为0)才执行后面的命令。如果 PUSHD 失败,则不执行 CD /D "%~dp0"。
CD /D "%~dp0": 切换当前目录到脚本所在的目录。
CD: 切换目录命令。
/D: 如果脚本位于不同的驱动器上,加上 /D 选项可以同时切换驱动器和目录。
%~dp0: 获取批处理脚本的完整路径,包括驱动器号和目录。 %0 表示批处理脚本自身的文件名,%~dp0 是一个扩展的变量引用,表示从 %0 中提取驱动器号和路径。
>NUL 2>&1 REG.exe query "HKU\S-1-5-19" || (:
>NUL 2>&1: 将命令的输出和错误都重定向到 NUL 设备(也就是“空设备”),相当于丢弃所有的输出和错误信息。 > 用于重定向输出,2> 用于重定向错误,&1 表示将错误重定向到标准输出(也就是和输出一样处理),然后 NUL 表示丢弃目标。
REG.exe query "HKU\S-1-5-19": 使用 REG.exe 命令查询注册表。
REG.exe: Windows 自带的注册表操作工具。
query: REG.exe 的一个子命令,用于查询注册表键的值。
"HKU\S-1-5-19": 要查询的注册表键。 这个键 HKU\S-1-5-19 对应于 "LOCAL SERVICE" 账户的注册表位置,这通常被用作判断当前用户是否具有管理员权限的一种方法。如果能成功查询到这个键,通常表示具有管理员权限。
||: 连接两个命令,只有前面的命令执行失败(返回码非0)才执行后面的命令。 也就是说,如果查询注册表键失败(说明可能没有管理员权限),则执行后面的代码。
(: 开始一个代码块,当没有管理员权限时执行。
ECHO SET UAC = CreateObject^("Shell.Application"^) > "%TEMP%\Getadmin.vbs":
ECHO ... > "%TEMP%\Getadmin.vbs": 将字符串写入到 %TEMP%\Getadmin.vbs 文件中。 %TEMP% 是一个环境变量,表示临时文件夹的路径。
SET UAC = CreateObject^("Shell.Application"^) : 这是一个 VBScript 代码片段,用于创建一个 Shell.Application 对象,该对象用于提升权限。 ^ 是转义字符,用于在批处理脚本中表示 " 字符。 VBScript 是一个脚本语言,通常用于Windows 系统管理。这段代码创建了一个可以用来请求管理员权限的 COM 对象。
ECHO UAC.ShellExecute "%~f0", "%1", "", "runas", 1 >> "%TEMP%\Getadmin.vbs":
ECHO ... >> "%TEMP%\Getadmin.vbs": 将字符串追加写入到 %TEMP%\Getadmin.vbs 文件中。 >> 表示追加写入,而不是覆盖写入。
UAC.ShellExecute "%~f0", "%1", "", "runas", 1: 这是另一个 VBScript 代码片段,用于执行一个程序。
"%~f0": 当前批处理脚本的完整路径。"%" 包裹的变量 %~f0 在脚本执行时会被替换。
"%1": 批处理脚本的第一个参数。如果运行脚本时传入了参数,这些参数会传递给重新启动的具有管理员权限的脚本。
"": 工作目录,这里为空表示使用默认工作目录
"runas": 指定以管理员权限运行。 这会触发 Windows 的 UAC (User Account Control) 提示,请求用户授予管理员权限。
1: 指定窗口显示方式。 1 表示正常显示。
"%TEMP%\Getadmin.vbs":
执行刚刚创建的 VBScript 文件。 这会弹出 UAC 提示框,请求管理员权限。
DEL /f /q "%TEMP%\Getadmin.vbs" 2>NUL:
删除 %TEMP%\Getadmin.vbs 文件。
DEL: 删除文件命令。
/f: 强制删除只读文件。
/q: 安静模式,不提示确认。
"%TEMP%\Getadmin.vbs": 要删除的文件。
2>NUL: 将错误信息重定向到 NUL,防止在控制台上显示错误信息。(例如,如果文件不存在)
Exit /b:
退出当前批处理脚本。 /b 选项表示立即退出,不会执行后续的命令。
): 结束当没有管理员权限时执行的代码块。功能总结:
检查管理员权限: 脚本首先尝试查询一个通常只有管理员才能访问的注册表键,以判断当前是否具有管理员权限。
请求管理员权限: 如果没有管理员权限,脚本会创建一个 VBScript 文件,该文件使用 Shell.Application.ShellExecute 方法以管理员权限重新运行自身。 这会触发 UAC 提示。
重新运行自身: 用户授予管理员权限后,脚本会以管理员权限重新启动。
清理临时文件: 脚本会删除创建的临时 VBScript 文件。应用场景:
这种脚本经常用于需要管理员权限才能执行的批处理脚本。 例如,安装程序、修改系统设置、访问受保护的文件等等。 它可以自动检测权限并请求提升,从而简化用户的操作。
安全性:
虽然这种脚本很方便,但也存在一些安全风险:
UAC 绕过: 历史上存在一些 UAC 绕过漏洞,攻击者可以利用这些漏洞在未经用户授权的情况下获取管理员权限。 因此,始终保持 Windows 系统更新到最新版本非常重要。
恶意脚本: 如果下载并运行了来路不明的批处理脚本,该脚本可能会包含恶意代码,例如安装病毒、窃取数据等等。 因此,只运行你信任的脚本。
代码审查: 在运行任何批处理脚本之前,最好先仔细审查代码,确保它没有执行任何恶意操作。
简化版本:
可以使用以下简化的版本来实现相同的功能:
@echo off
net session >nul 2>&1
if %errorLevel% == 0 (echo 管理员权限已存在pause
) else (echo 正在请求管理员权限...mshta vbscript:CreateObject("Shell.Application").ShellExecute("%~f0", "", "", "runas", 1)(window. Close)exit
)
这个版本使用了 net session 命令来判断当前是否具有管理员权限,并且使用了 mshta 命令来执行 VBScript 代码,从而简化了代码。
========================================================
好了,今天的代码分析就这些了。
希望这个详细的解释能够帮助你理解这段批处理脚本的功能和作用。