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

[系统相关] 关于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)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 07:06 , Processed in 0.017833 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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