0%

在批处理中获取UAC管理员权限(1)

使用批处理运行程序

当我们需要按照一定顺序,执行某些程序或者某些CMD指令时,一般会选择BAT批处理文件来执行,
但是有时候某些指令,需要管理员权限才能执行,而每次右键选择以管理员权限运行,操作又比较繁琐。

这里在BAT文件开头加入如下代码,就可以自动检测是否是管理员权限运行,当不具有管理员权限时,
会弹出UAC控制窗口,提示用户是否使用管理员权限继续执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@echo off
:: BatchGotAdmin
:-------------------------------------
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
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 on

相关代码的说明

依据空行可以把以上代码划分为4部分功能:

第1部分,使用 cacls.exe 访问 system 注册表文件,得到一个返回值。

第2部分,检测这个返回值是否是0,不为0表示访问失败,需要提升权限。

第3部分,创建一个 getadmin.vbs 脚本文件,写入 用runas以管理员权限创建新的控制台 代码,
运行这个vbs脚本文件,并退出旧的控制台。

第4部分,删除vbs脚本,然后在新的控制台中,切换到当前的执行目录。