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

[系统相关] 关于win11下批处理mshta权限提升失效的解决

[复制链接]
发表于 2025-12-25 23:30:46 | 显示全部楼层 |阅读模式
本帖最后由 RENaa_FD 于 2025-12-25 23:32 编辑

最常见的权限提升方式是通过mshta执行VBS通过RunAs弹出UAC请求来实现:
  1. %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close) && exit
复制代码
但是我最近才发现在最新的win11上,这行批处理完全失效了,查了一些信息后发现现在win11默认禁用mshta执行VBS
遂用PowerShell重写:
  1. %1 powershell -NoProfile -Command "Start-Process cmd -ArgumentList '/c','%~s0','::' -Verb RunAs" 2>nul && exit
复制代码
但PowerShell不能覆盖mshta存在的所有windows版本
故优先PowerShell,若失败(不包括UAC拒绝)则回退使用mshta:
  1. %1 setlocal EnableDelayedExpansion && (powershell -NoProfile -Command "try { Start-Process cmd -ArgumentList '/c','%~s0','::' -Verb RunAs } catch { exit 999 }" 2>nul && exit ) || if "!errorlevel!" neq "999" mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close) && exit
复制代码
我不太喜欢 权限提升失败则继续执行 以及 生硬的直接exit ,所以做了一些额外修改:
  1. %1 setlocal EnableDelayedExpansion && (powershell -NoProfile -Command "try { Start-Process cmd -ArgumentList '/c','%~s0','::' -Verb RunAs } catch { exit 999 }" 2>nul && exit /b) || if "!errorlevel!" equ "999" (exit /b) else mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close) && exit /b
复制代码
这行批处理即是我最终使用的版本,从win xp到win11均有效,但实在是有点复杂,各位大神若有更好的想法可以讨论讨论
发表于 2025-12-26 12:07:15 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-12-26 18:40 编辑

回复 1# RENaa_FD

以下一行流代码先检测当前系统版本号以便适配 mshta 提权代码或 powershell 提权代码,仅用于源批处脚本不带命令行参数...

方法一。mshta@vbs 版本

  1. %~1 for /f "tokens=4 delims=. " %%v in ('ver') do if %%v lss 10 (mshta "vbscript:CreateObject(""Shell.Application"").ShellExecute ""%~f0"",""::"",,""runas"",1:window.close" &exit/b) else (powershell -noP -c "start -file '%~f0' -arg '::' -verb runas" &exit/b)
复制代码
方法二。mshta@jscript 版本

  1. %~1 @cd /d "%~dp0" && for /f "tokens=4 delims=. " %%v in ('ver') do if %%v lss 10 (mshta "javascript:new ActiveXObject('shell.application').shellexecute('%~nx0', '::', '', 'runas', 1);window.close()" &exit/b) else (powershell -noP -c "start -file '%~f0' -arg '::' -verb runas" &exit/b)
复制代码
发表于 2026-7-13 14:43:50 | 显示全部楼层
请问,如果要处理传递给批处理的参数,UAC获取权限的代码又该怎么写?
发表于 2026-7-13 16:26:46 | 显示全部楼层
87zrjojo 发表于 2026-7-13 14:43
请问,如果要处理传递给批处理的参数,UAC获取权限的代码又该怎么写?

详见 http://www.bathome.net/thread-75839-1-1.html 4楼
发表于 2026-9-1 18:02:14 | 显示全部楼层
本帖最后由 87zrjojo 于 2026-9-1 18:03 编辑

跟个贴。通过MSHTA + PowerShell提升管理员权限,代码简洁,但不能传递参数。我在楼主的基础上,改了下,感觉更精简一点,加了jscript实现方法。
  1. @ECHO OFF

  2. REM 通过MSHTA(vbs/jscript) + PowerShell提升管理员权限,不能传递参数

  3. REM vbs
  4. %1 CD /D "%~DP0" & SETLOCAL ENABLEDELAYEDEXPANSION & POWERSHELL -NoProfile -Command "Start-Process -FilePath 'cmd.exe' -ArgumentList '/c','\"%~f0\"','::' -Verb RunAs" 2>NUL || MSHTA vbscript:CreateObject^("Shell.Application"^).ShellExecute^("cmd.exe","/c ""%~f0"" ::","","runas",1^)^(window.close^) & EXIT /B

  5. REM Jscript
  6. %1 CD /D "%~DP0" & SETLOCAL ENABLEDELAYEDEXPANSION & SET "fullpath=%~f0" & SET "fullpath=!fullpath:\=\\!" & POWERSHELL -noP -c "start -file 'cmd.exe' -arg '/c \"%~f0\" ::' -verb runas" 2>NUL || MSHTA "javascript:new ActiveXObject('Shell.Application').ShellExecute('cmd.exe','/c \x22!fullpath!\x22 ::','','runas',1);close()" & EXIT /B

  7. :runas
  8. >NUL 2>NUL REG QUERY "HKU\S-1-5-19" || ECHO 未获取到管理员权限!
  9. ECHO Hello World!

  10. PAUSE & EXIT /B
复制代码
发表于 2026-9-1 19:19:04 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-9-1 19:32 编辑
87zrjojo 发表于 2026-9-1 18:02
跟个贴。通过MSHTA + PowerShell提升管理员权限,代码简洁,但不能传递参数。我在楼主的基础上,改了下,感 ...


   以往用 mshta+vbs 或 mshta+jscript 实现提权,通常是针对低版 win 系统(没有标配 powershell 组件),或不愿忍受采用 powershell 提权的 '首启迟缓' 这个缺陷,或是要避免生成和删除临时脚本文件(*.vbs, *.js)的麻烦。
   总之,逻辑上没必要把 mshta 和 powershell 绑定,因为在可用 powershell 的各版系统中,仅用 powershell 实现提权,代码更轻量化(参见4楼链接帖有关内容),而且在 win7-11 各版系统中一路畅通;但 mshta 上行之道不容乐观,win11 高版本(在 win11 25H2 已实测验证)仍然放行 *.hta 脚本文件可独立运行,但对内嵌 mshta 代码(如一楼所示用法)已被封禁了...
发表于 2026-9-2 10:36:22 | 显示全部楼层
aloha20200628 发表于 2026-9-1 19:19
以往用 mshta+vbs 或 mshta+jscript 实现提权,通常是针对低版 win 系统(没有标配 powershell 组件) ...

谢谢指导,学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-9-14 11:49

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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