|
|
发表于 2026-3-19 11:40:59
|
显示全部楼层
本帖最后由 aloha20200628 于 2026-3-30 18:29 编辑
有关 '批处脚本自行完成提权(即不用右键管理员启运或不在管理员窗口中启运)' 的问题不断被问,以下用三个示例代码分享其中几个要点,因实测 win11 24h2 版本已彻底移除了 mshta 内嵌式代码运行权限(但运行 *.hta 脚本文件或 bat+mshta 混编脚本文件依然被支持),以下示例只用 powershell 方法以免创建 *.vbs / *.js 临时文件或构造混编版式的批处脚本。
一。在批处脚本中自行申请提权并隐藏其提权窗口通常有两个方法,一是通过 vbs/jscript/mshta 调用 shellExecute 方法,二是通过 powershell 调用 start 方法,二者皆可管控提权窗口状态(如隐藏与否等)。前者若采用 mshta 可避免创建 *.vbs, *.js 临时文件或混编版式(bat+vbs,bat+jscript)而直接在批处脚本中实现;如果不用 mshta 可采用 powershell 方法直接在批处脚本中实现。win8-11 系统均标配 powershell,故采用 powershell 方法提权批处脚本更为简捷,winXP/win7/winPE 未预装 powershell 的场合,通常采用 mshta 代码较为简洁,只不过会导致闪屏而已。
二。被提权的批处脚本若没有命令行参数或其命令行参数不包含双引号(即单个参数不内含空格),其句式比较简洁,如以下 a, b 版示例代码;若脚本路径和命令行参数均包含双引号,则句式略为复杂,如以下 c 版代码。
三。判断当前是否为提权状态的方法很多,dostips.com, stackoverflow.com 论坛曾推荐采用系统内置的 fltmc 命令,因其通行 xp,7-11 及 pe 各个系统,反应速度快其不必联网。
四。系统在 '用户帐户控制' 未设置为 '从不通知' 状态时,脚本申请提权或开启cmd管理员窗口之前会弹窗等候确认,要取消此步骤,须先手动设置完毕方可。
a 版 》脚本路径可含空格,没有命令行参数 // 备注:提权代码仅创建一个空文件 x.0
- @echo off &fltmc>nul 2>nul || (powershell -c "start '%~f0' -verb runas -win h" &exit/b)
- :: 以下是须在提权状态下被执行的批处脚本原代码
- cd.>"%~dp0x.0"<nul &exit/b
复制代码
b 版 》脚本路径可含空格,有命令行参数但其中不能包含双引号 // 备注:提权代码仅创建一个覆写原始命令行参数的文件 x.1
- @echo off &fltmc>nul 2>nul || (powershell -c "start '%~f0' -arg '%*' -verb runas -win h" &exit/b)
- :: 以下是须在提权状态下被执行的批处脚本原代码
- >"%~dp0x.1" echo,%*
- exit/b
复制代码
c 版 》脚本路径可含空格,有命令行参数且其中可包含双引号 // 备注:提权代码仅创建一个覆写原始命令行参数的文件 x.2
- @echo off &fltmc>nul 2>nul || (
- set argv=%*
- setlocal enabledelayedexpansion
- set argv=/c \"\"%~f0\" !argv:"=\"!\"
- powershell -c "start cmd.exe -arg '!argv!' -verb runas -win h" &exit/b)
- :: 以下是须在提权状态下被执行的批处脚本原代码
- >"%~dp0x.2" echo,%*
- exit/b
复制代码
|
|