0

我在批处理脚本中向管理员请求以下内容:

: 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 管理员权限),同时仍然保持日志文件按预期运行?

4

3 回答 3

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"

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

于 2013-12-17T09:08:13.413 回答
0

我的方法是检查 shell 脚本中的提升,如果没有提升则失败;例如

@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

账单

于 2013-03-25T14:28:55.947 回答
0

我担心顺序

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

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

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

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

于 2013-03-24T23:03:00.387 回答