当前位置: 首页 > ai >正文

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 代码,从而简化了代码。

========================================================

好了,今天的代码分析就这些了。

希望这个详细的解释能够帮助你理解这段批处理脚本的功能和作用。

http://www.xdnf.cn/news/13772.html

相关文章:

  • vue3 常见引用
  • 伊吖学C笔记(6、数、求和、排列)
  • 模拟电路的知识
  • 如何通过插件系统打造个性化效率工作流
  • go部分语法记录
  • 【Fifty Project - D36】
  • 2025pmx文件怎么打开blender和虚幻
  • 林业资源多元监测技术守护绿水青山
  • 说一下Java里面线程池的拒绝策略
  • 从实验室到实践:无人机固件越权提取技术解析
  • DNS常用的域名记录
  • 品融电商:头部全域电商代运营,助品牌决胜多平台时代
  • supervisorctr命令简介
  • 翻译核心词汇
  • React中修改 state 时必须返回一个新对象 (immutable update)
  • Windows环境变量原理(用户变量与系统变量)(用户环境变量、系统环境变量)
  • 解锁 AI 短视频创作密码,开启你的创意之旅
  • DOcplex用法锦集(持续更新)
  • CKA考试知识点分享(12)---configmap
  • 【Android Studio】新建项目及问题解决
  • python3如何使用QT编写基础的对话框程序
  • 【开发常用命令】:服务器与本地之间的数据传输
  • wsl 安装vllm 0.9.1 + torch 2.7.0 + xformers 0.0.30 + flashinfer
  • RocketMQ 客户端编程模型
  • 第28节 Node.js 文件系统
  • SAP调用deepseek 的API
  • 成像细节丢失如何解决?OAS 矩孔衍射聚焦模型来解困
  • JY901-ROS2驱动代码
  • 力扣-70.爬楼梯
  • 解决蓝牙MAC 地址倒序问题