|
|
本帖最后由 87zrjojo 于 2026-7-19 18:30 编辑
在WIN10以上系统中使用批处理最大的问题就是权限不足,有时候真不太方便。以前都是在网上找各种代码用,但不清楚原理,好在最近找到本论坛,像找到组织一样,学习到了很多东西。
我研究了一下UAC提权的原理,也自己搞了一个批处理来自动提升权限,这个代码适合通过UAC自动获取管理员权限,代码提供了三种方式来实现,即bat+jscript混合编码以及mshta/vbs、powershell,都是在论坛里面学到的常规方式,但个人做了一点小小的优化,可以支持给批处理传递参数(支持带引号的参数),核心原理无非就是通过vbs/jscript/mshta 调用 shellExecute 方法或Powwershell Start-process runas。在此贴出自己的心得,忘论坛的大神、高人们帮忙指点优化一下。
- @set @JScript=0 /*
- :: 2>1/* ::
- @ECHO OFF
- REM ===================================================================
- REM UAC提权工具(优化增强版)
- REM 作者:初一的阳光 2026-07-18
- REM 功能:通过UAC获取管理员权限(JScript/VBS/PowerShell),支持WinXP-Win11
- REM 用法:支持直接双击运行或命令行传递参数使用(支持传递多个参数或带引号的参数)
- REM 注意:可在提权后可使用 %Argv% 变量来解析传递的参数
- REM ===================================================================
- SETLOCAL ENABLEDELAYEDEXPANSION
- CD /D "%~DP0"
- TITLE 提升管理员权限(自行更改)
- REM ===================================================================
- REM 保存所有命令行参数到环境变量(以便提升权限后能使用)
- REM ===================================================================
- SET "Argv=%*"
- REM ECHO [DEBUG]原始参数:!Argv!
- FLTMC >NUL 2>&1 || NET SESSION >NUL 2>&1
- IF NOT %ERRORLEVEL% EQU 0 (
- REM ================================================================
- REM 方法1:Bat + JScript 混合编码(通过 CSCRIPT 执行,不依赖外部工具)
- REM 利用脚本末尾的 JScript 代码,调用 ShellExecute 提权
- REM 传递的命令行参数由 JScript 从环境变量 Argv 读取并构建
- REM ================================================================
- CSCRIPT.EXE //Nologo /E:jscript "%~f0" && EXIT /B
-
- REM ================================================================
- REM 方法2:VBS (MSHTA) 提权,参数中的双引号 " 替换为 ""(VBS 字符串转义需求)
- REM 构造参数格式:/C "SET ERROR=0 & PUSHD "脚本目录" & "脚本路径" 参数"
- REM /C 表示提权后会自动关闭CMD窗口,可改为使用 /K 提权后保持窗口打开(方便调试)
- REM ================================================================
- IF DEFINED Argv SET "Argv_V=%Argv:"=""%"
- SET "CMDLINE=/C ""SET ERROR=0 & PUSHD ""%~DP0"" & ""%~f0"" !Argv_V!"""
- REM ECHO [DEBUG]传递参数:"!CMDLINE!"
- MSHTA vbscript:CreateObject^("Shell.Application"^).ShellExecute^("CMD.EXE","!CMDLINE!","","RunAs",1^)^(window.close^) && EXIT /B
- REM MSHTA "javascript:new ActiveXObject('Shell.Application').ShellExecute('%~nx0', '%Argv%', '', 'runas', 1);window.close()" && EXIT /B
-
- REM ================================================================
- REM 方法3:PowerShell 提权,参数中的双引号 " 替换为 \"(\为Ps的转义字符)
- REM 构造参数时使用多重双引号嵌套,PowerShell 会将命令参数中的 """ 解析为 "
- REM 关键:使用三个双引号包围路径和参数,以应对 PowerShell 对引号的特殊处理
- REM ================================================================
- IF DEFINED Argv SET "Argv_P=!Argv:"=\"!"
- SET "CMDLINE=/C """"SET ERROR=0 ^& PUSHD """%~DP0""" ^& """%~f0""" !Argv_P!"""""
- REM ECHO [DEBUG]传递参数:"!CMDLINE!"
- POWERSHELL -NoProfile -Command "Start-Process -FilePath 'CMD.EXE' -ArgumentList '!CMDLINE!' -Verb RunAs" && EXIT /B
-
- REM ================================================================
- REM 方法4:PowerShell 通过读取CMD的环境变量传递 CMDLINE(备选)
- REM PowerShell在解析处理参数时,会自动为参数添加引号,保留作为参考
- REM ================================================================
- SET "CMDLINE=/K "SET ERROR=0 ^& PUSHD "%~DP0" ^& "%~f0" %*""
- ECHO [DEBUG]传递参数:"!CMDLINE!"
- POWERSHELL -NoProfile -Command "$c = $env:CMDLINE; Start-Process -FilePath 'cmd.exe' -ArgumentList $c -Verb RunAs" && EXIT /B
-
- REM ================================================================
- REM 若所有提权方法均失败,提示用户手动以管理员身份运行
- REM ================================================================
- ECHO 请使用右键“以管理员身份运行”本脚本!& PAUSE & EXIT /B
- )
- REM ===================================================================
- REM 主代码段写在这里(已提权或原本需要管理员权限运行的代码)
- REM ===================================================================
- echo,
- echo 获取传递参数:%Argv%
- echo 当前工作路径:%CD%
- echo,
- REM 此处为退出代码,保证批处理程序运行后不会执行后面的JScript代码
- EXIT /B
- */
- // JScript 提升权限代码(由 cscript 执行)
- // Shell.ShellExecute "执行文件","命令参数","执行文件绝对路径","操作",窗口显示类型
- // 构建命令参数格式:/k "SET ERROR=0 & PUSHD "脚本目录" & "脚本完整路径" 参数"
- var WSH = new ActiveXObject("WScript.Shell");var Env = WSH.Environment("PROCESS");
- var Args = Env("Argv") || ""; // 从环境变量读取参数,若不存在则设为空字符串
- var ScriptFullPath = WScript.ScriptFullName; // 获取脚本路径
- var ScriptDir = ScriptFullPath.substring(0, ScriptFullPath.lastIndexOf('\\'));
- var Argv = '/C "SET ERROR=0 & PUSHD "' + ScriptDir + '" & "' + ScriptFullPath + '"' + (Args?' '+Args:'') + '"';
- var SHA = new ActiveXObject("Shell.Application");SHA.ShellExecute(Env("COMSPEC"), Argv, "", "runas", 1);
复制代码
使用示例:
将以上代码保存为evaluate.bat
1. 直接双击运行,如果运行后需要保留CMD窗口,可以将/C改为/K
2. 在普通CMD窗口中通过命令行传递参数使用,如:evaluate.bat hello "123 456"
|
|