Windows批处理脚本 - 以对数友好的方式请求UAC管理员权限

时间:2013-03-24 22:10:29

标签: windows logging batch-file admin uac

我在批处理脚本中请求管理员:

: 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"
    set params = %*:"=""
    echo UAC.ShellExecute "%~s0", "%params%", "", "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"

将输出传递给日志文件时 - 脚本中的这一点将其切断。有没有办法改变脚本以产生相同的效果(在批处理脚本中间请求UAC管理员权限),同时仍保持日志文件按预期运行?

3 个答案:

答案 0 :(得分:0)

我关注序列

set params = %*:"=""
echo UAC.ShellExecute "%~s0", "%params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

应该做的是将环境变量“params [space]”设置为值 [space]command-parameters supplied:“=”“

在下一行中,您正在使用可能未设置的环境变量“params”。因此,我不确定getadmin.vbs是否正确生成。

SET任何一边的空格都很重要......

答案 1 :(得分:0)

我的方法是检查shell脚本中的高程,如果没有提升则失败; e.g。

@echo off
setlocal enableextensions
isadmin -q
if %ERRORLEVEL% NEQ 1 goto :ERROR
...
[do stuff requiring elevation]
....
goto :DONE

:ERROR
echo You must run this script from an elevated command window.

:DONE
endlocal

您可以从此处获取isadmin.exe:Windows Admin Script Tools

比尔

答案 2 :(得分:0)

我知道这个问题已经有8个月了,但是因为你似乎没有得到一个好的答案,我认为无论如何我都会插手,因为我正在寻找其他东西。

我同意Magoo,因为我也不确定set params行是否正在做你想要的。我建议尝试这样做:

在您的UAC开始时:

:UACPrompt
if '%1'=='UACdone' (shift & goto gotAdmin)

然后在您的原始行之后:

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~0", "UACdone", "", "runas", 1 >> "%temp%\getadmin.vbs"

为了清楚起见,应该使整个脚本看起来如此:

: 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
    if '%1'=='UACdone' (shift & goto gotAdmin)
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~0", "UACdone", "", "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"

将它放在脚本的顶部,如果您没有管理员权限,它应该生成另一个请求管理员权限的实例。您需要做的就是将命令放在下面。这样做的另一个好处是不需要您随脚本重新分发任何其他工具。