批处理判断是否为管理员权限如果不是则自动获取管理权限
作者:王二小
有时编写bat批处理时会用到判断当前是否为管理员权限以及自动以管理员权限运行,在这里记录几个常用的方法,需要的朋友可以参考下
实际应用代码
@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
自动用管理员身份运行bat
将以下代码加在开头
第一种:
@echo off >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" ) pushd "%CD%" cd /D "%~dp0"
第二种:
@ echo off %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit cd /d "%~dp0" :Admin
更多内容可以参考这篇文章 让bat批处理以管理员权限运行的实现方法