找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 107|回复: 0

[系统相关] 通过UAC自动获取管理员权限

[复制链接]
发表于 昨天 18:19 | 显示全部楼层 |阅读模式
本帖最后由 87zrjojo 于 2026-7-19 18:30 编辑

在WIN10以上系统中使用批处理最大的问题就是权限不足,有时候真不太方便。以前都是在网上找各种代码用,但不清楚原理,好在最近找到本论坛,像找到组织一样,学习到了很多东西。
我研究了一下UAC提权的原理,也自己搞了一个批处理来自动提升权限,这个代码适合通过UAC自动获取管理员权限,代码提供了三种方式来实现,即bat+jscript混合编码以及mshta/vbs、powershell,都是在论坛里面学到的常规方式,但个人做了一点小小的优化,可以支持给批处理传递参数(支持带引号的参数),核心原理无非就是通过vbs/jscript/mshta 调用 shellExecute 方法或Powwershell Start-process runas。在此贴出自己的心得,忘论坛的大神、高人们帮忙指点优化一下。

  1. @set @JScript=0 /*
  2. :: 2>1/* ::
  3. @ECHO OFF
  4. REM ===================================================================
  5. REM  UAC提权工具(优化增强版)
  6. REM  作者:初一的阳光 2026-07-18
  7. REM  功能:通过UAC获取管理员权限(JScript/VBS/PowerShell),支持WinXP-Win11
  8. REM  用法:支持直接双击运行或命令行传递参数使用(支持传递多个参数或带引号的参数)
  9. REM  注意:可在提权后可使用 %Argv% 变量来解析传递的参数
  10. REM ===================================================================
  11. SETLOCAL ENABLEDELAYEDEXPANSION
  12. CD /D "%~DP0"
  13. TITLE 提升管理员权限(自行更改)

  14. REM ===================================================================
  15. REM  保存所有命令行参数到环境变量(以便提升权限后能使用)
  16. REM ===================================================================
  17. SET "Argv=%*"
  18. REM ECHO [DEBUG]原始参数:!Argv!

  19. FLTMC >NUL 2>&1 || NET SESSION >NUL 2>&1
  20. IF NOT %ERRORLEVEL% EQU 0 (
  21.     REM ================================================================
  22.     REM  方法1:Bat + JScript 混合编码(通过 CSCRIPT 执行,不依赖外部工具)
  23.     REM  利用脚本末尾的 JScript 代码,调用 ShellExecute 提权
  24.     REM  传递的命令行参数由 JScript 从环境变量 Argv 读取并构建
  25.     REM ================================================================
  26.     CSCRIPT.EXE //Nologo /E:jscript "%~f0" && EXIT /B
  27.    
  28.     REM ================================================================
  29.     REM  方法2:VBS (MSHTA) 提权,参数中的双引号 " 替换为 ""(VBS 字符串转义需求)
  30.     REM  构造参数格式:/C "SET ERROR=0 & PUSHD "脚本目录" & "脚本路径" 参数"
  31.     REM  /C 表示提权后会自动关闭CMD窗口,可改为使用 /K 提权后保持窗口打开(方便调试)
  32.     REM ================================================================
  33.     IF DEFINED Argv SET "Argv_V=%Argv:"=""%"
  34.     SET "CMDLINE=/C ""SET ERROR=0 & PUSHD ""%~DP0"" & ""%~f0"" !Argv_V!"""
  35.     REM ECHO [DEBUG]传递参数:"!CMDLINE!"
  36.     MSHTA vbscript:CreateObject^("Shell.Application"^).ShellExecute^("CMD.EXE","!CMDLINE!","","RunAs",1^)^(window.close^) && EXIT /B
  37.     REM MSHTA "javascript:new ActiveXObject('Shell.Application').ShellExecute('%~nx0', '%Argv%', '', 'runas', 1);window.close()" && EXIT /B
  38.    
  39.     REM ================================================================
  40.     REM  方法3:PowerShell 提权,参数中的双引号 " 替换为 \"(\为Ps的转义字符)
  41.     REM  构造参数时使用多重双引号嵌套,PowerShell 会将命令参数中的 """ 解析为 "
  42.     REM  关键:使用三个双引号包围路径和参数,以应对 PowerShell 对引号的特殊处理
  43.     REM ================================================================
  44.     IF DEFINED Argv SET "Argv_P=!Argv:"=\"!"
  45.     SET "CMDLINE=/C """"SET ERROR=0 ^& PUSHD """%~DP0""" ^& """%~f0""" !Argv_P!"""""
  46.     REM ECHO [DEBUG]传递参数:"!CMDLINE!"
  47.     POWERSHELL -NoProfile -Command "Start-Process -FilePath 'CMD.EXE' -ArgumentList '!CMDLINE!' -Verb RunAs" && EXIT /B
  48.    
  49.     REM ================================================================
  50.     REM  方法4:PowerShell 通过读取CMD的环境变量传递 CMDLINE(备选)
  51.     REM  PowerShell在解析处理参数时,会自动为参数添加引号,保留作为参考
  52.     REM ================================================================
  53.     SET "CMDLINE=/K "SET ERROR=0 ^& PUSHD "%~DP0" ^& "%~f0" %*""
  54.     ECHO [DEBUG]传递参数:"!CMDLINE!"
  55.     POWERSHELL -NoProfile -Command "$c = $env:CMDLINE; Start-Process -FilePath 'cmd.exe' -ArgumentList $c -Verb RunAs" && EXIT /B
  56.    
  57.     REM ================================================================
  58.     REM  若所有提权方法均失败,提示用户手动以管理员身份运行
  59.     REM ================================================================
  60.     ECHO 请使用右键“以管理员身份运行”本脚本!& PAUSE & EXIT /B
  61. )

  62. REM ===================================================================
  63. REM  主代码段写在这里(已提权或原本需要管理员权限运行的代码)
  64. REM ===================================================================
  65. echo,
  66. echo 获取传递参数:%Argv%
  67. echo 当前工作路径:%CD%
  68. echo,


  69. REM 此处为退出代码,保证批处理程序运行后不会执行后面的JScript代码
  70. EXIT /B
  71. */

  72. // JScript 提升权限代码(由 cscript 执行)
  73. // Shell.ShellExecute "执行文件","命令参数","执行文件绝对路径","操作",窗口显示类型
  74. // 构建命令参数格式:/k "SET ERROR=0 & PUSHD "脚本目录" & "脚本完整路径" 参数"
  75. var WSH = new ActiveXObject("WScript.Shell");var Env = WSH.Environment("PROCESS");
  76. var Args = Env("Argv") || ""; // 从环境变量读取参数,若不存在则设为空字符串
  77. var ScriptFullPath = WScript.ScriptFullName; // 获取脚本路径
  78. var ScriptDir = ScriptFullPath.substring(0, ScriptFullPath.lastIndexOf('\\'));
  79. var Argv = '/C "SET ERROR=0 & PUSHD "' + ScriptDir + '" & "' + ScriptFullPath + '"' + (Args?' '+Args:'') + '"';
  80. 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"
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-7-20 20:23

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表