【bat】windows脚本bat 优雅地获取管理员权限,以管理员权限运行
bat优势
相较powershell的脚本ps1,bat文件可以在不修改系统安全配置的前提下运行。功能较弱,可以配合其他脚本使用。
以下罗列了5种方式,并且给出了优缺点比较。
5种实现方式
- 初级版
这种是很早的一种实现方式,需要中间文件vbs脚本来实现(bat和vbs混排可以实现无需中间文件,但是很复杂,不推荐)
尝试读取系统目录文件,判断执行结果以确认是否有管理员权限
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
- 进化版
很巧妙的一种方式,获取管理员权限后把第一个参数设置为::,把该行作为注释,避免重复执行。
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
- 超进化版vbs
如果执行该脚本时已经是管理员权限,则上面代码还是会执行。
使用Net session判断是否为管理员权限,如果不是,则请求获取权限。
Net session >nul 2>&1 || mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0","","runas",1)(window.close)&&exit
- powershell版
相比上面的方法,使用powershell的方式更加简洁。且win10推荐使用powershell。
Net session >nul 2>&1 || powershell start-process hello.bat -verb runas
- 带参数powershell版
上面的所有方法,都缺少了参数的转发。
参数的转发其实不复杂,复杂的是带空格的参数。
有兴趣可以自己先研究下,这里就暂不公开。