CMD命令行中以管理员权限启动应用程序实现方法
投稿:junjie
很多时候我们需要管理员权限来运行bat那么就需要结合vbscript来实现了
代码一
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
常用
@echo off mode con lines=30 cols=60 %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit cd /d "%~dp0" rem 下面可以写你的bat代码了
代码二:
@echo off %1 %2 ver|find "5.">nul&&goto :st mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :st","","runas",1)(window.close)&goto :eof :st copy "%~0" "%windir%\system32\"
代码三
::UAC提权 @echo off&(cd/d "%~dp0")&(cacls "%SystemDrive%\System Volume Information" >nul 2>&1)||(start "" mshta vbscript:CreateObject^("Shell.Application"^).ShellExecute^("%~snx0"," %*","","runas",1^)^(window.close^)&exit /b) ::后面写你自己的脚本 @echo ON
代码四
@ECHO OFF&(PUSHD "%~DP0")&(REG QUERY "HKU\S-1-5-19">NUL 2>&1)||( powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"&&EXIT)
判断是否以管理员身份运行
这个操作方式比较多,核心思想就是试图访问需要管理员身份才可以访问的资源,可以访问则有权限,不可以访问则没有权限
以下三种方式都可以进行判断,可以灵活使用
"%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" REG QUERY "HKU\S-1-5-19" net.exe session
使用管理员权限运行
提供两种方式
VBS方式
mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)
powershell方式
%~sdpnx0: 指向当前批处理文件
powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"
powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"&&EXIT
这是一个PowerShell命令,用于以管理员权限启动当前执行的脚本。
这段代码的主要部分是 Start-Process '%~sdpnx0' -Verb RunAs,其中 %~sdpnx0 是一个批处理脚本中的变量替换,表示当前执行的批处理脚本文件的全路径名。-Verb RunAs 参数指示 Start-Process 使用提升的权限运行进程。
但是,这个命令在 PowerShell 中并不会直接以管理员权限运行当前脚本,因为 %~sdpnx0 这个变量替换在 PowerShell 中不会被正确解析。在 PowerShell 中,你可以使用 $PSCommandPath 变量来获取当前脚本的完整路径,然后使用 Start-Process 命令以管理员权限运行它。
下面是一个修改后的 PowerShell 命令,它可以以管理员权限运行当前脚本:
Start-Process "$PSCommandPath" -Verb RunAs
如果你想要这个命令在执行后自动退出,你可以在命令的末尾添加 & exit,如下所示:
Start-Process "$PSCommandPath" -Verb RunAs & exit
请注意,这些命令应该在 PowerShell 脚本中使用,而不是在批处理文件中。批处理文件中应使用不同的语法。
组合使用
提供两种组合方式,代码放于批处理前面使用即可,其他自由组合
:: 方式一 REG QUERY "HKU\S-1-5-19">NUL 2>&1||(powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"&&exit) :: 方式二 REG QUERY "HKU\S-1-5-19">NUL 2>&1||mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
原理类似
ShellExecute method
Run a script or application in the Windows Shell.
Syntax
.ShellExecute "application", "parameters", "dir", "verb", window
.ShellExecute 'some program.exe', '"some parameters with spaces"', , "runas", 1
Key
application The file to execute (required)
parameters Arguments for the executable
dir Working directory
verb The operation to execute (runas/open/edit/print)
window View mode application window (normal=1, hide=0, 2=Min, 3=max, 4=restore, 5=current, 7=min/inactive, 10=default)
Note the different (double " and single ' ) quotes that can be used to delimit paths with spaces.
The runas verb is undocumented but can be used to elevate permissions. When a script is run with elevated permissions several aspects of the user environment may change: The current directory, the current TEMP folder and any mapped drives will be disconnected.
runas will fail if you are running in WOW64 (a 32 bit process on 64 bit windows) for example %systemroot%\syswow64\cmd.exe ...
The ShellExecute method is a member of the IShellDispatch2 object.
Examples
Run a batch script with elevated permissions, flag=runas:
Set objShell = CreateObject("Shell.Application") objShell.ShellExecute "E:\demo\batchScript.cmd", "", "", "runas", 1
Run a VBScript with elevated permissions, flag=runas:
Set objShell = CreateObject("Shell.Application") objShell.ShellExecute "cscript", "E:\demo\vbscript.vbs", "", "runas", 1
“If you don't execute your ideas, they die” ~ Roger Von Oech
Related:
Run with elevated permissions - Script to run as Admin
.Exec - Execute command, returning an object
.Run - Run a command
joeware.net - CPAU (Create Process As User) like RunAs but with an options to encrypt the password.
Equivalent CMD command: ShellRunAs - Run a command under a different user account
批处理文件中的%~dp0表示含义
~是扩展的意思,相当于把一个相对路径转换绝对路径
%0代指批处理文件自身
%1表示批处理文件命令行接收到的第一个参数,%2表示第二个,以此类推
%~d0 是指批处理所在的盘符,其中d代表drive
%~p0 是指批处理所在的目录,其中p代表path
%~dp0 是批处理所在的盘符加路径
cd %~dp0 就是进入批处理所在目录了
详细解释还可参考命令 call /?
自从Vista带来了UAC之后,应用程序就变成了两种,有管理员权限的,和没有管理员权限的。一些老的应用程序会莫名其妙地出错,这时候就要考虑右击应用程序,然后“以管理员身份运行”。这还不是什么大问题,exe文件的右键菜单里都会有这个,但是对于一些脚本文件(cmd, js一类)来说,就没那么方便了。通常需要重新开一个带管理员权限的命令行窗口,然后打很多cd回到刚的文件夹,然后再运行脚本,相当麻烦。
搜了一下,找到一个解决办法。把下面的代码保存为Elevate.js:
var command = WScript.Arguments.Item(0); var argument = ""; for (var i = 0; i < WScript.Arguments.Count(); ++i){ argument += WScript.Arguments.Item(i) + " "; } try{ var shellapp = new ActiveXObject("Shell.Application"); shellapp.ShellExecute(command, argument, null, "runas", 1); } catch(e){ WScript.Echo("Something wrong: " + e.description); }
以后要以管理员身份运行程序的时候,只要输入“Elevate <exefile> <arguments>”就可以了,比如“Elevate cmd /k”。
当然,这个逃不过UAC的检查,还是会有一个对话框弹出来要点“确定”的。