Baixe arquivos da linha de comando no Windows + executando um deles com privilégios de administrador

0

Durante a semana passada, estou experimentando uma nova maneira de "implantar" uma pasta na área de trabalho de outro computador, fazer o download de alguns arquivos e depois executá-los como administrador. A única coisa é que o arquivo que faz tudo isso precisa ser realmente leve, como menos de 500 KB, ou então é inútil.

O que estou fazendo até agora é: Eu estou usando um arquivo SFX WinRar-criado chamado Program.exe que contém 2 arquivos, o arquivo run.bat e o winhttpjs.bat que eu uso para baixar os outros arquivos ( link )

O run.bat contém este código:

@echo off
    MKDIR "%userprofile%\Desktop\Folder1"
    CALL winhttpjs.bat "https://docs.google.com/uc?export=download&id=id1" -saveTo "%userprofile%\Desktop\Folder1\File1.bat"
    CALL winhttpjs.bat "https://docs.google.com/uc?export=download&id=id2" -saveTo "%userprofile%\Desktop\Folder1\winhttpjs.bat"
    START "%userprofile%\Desktop\Folder1\File1.bat"
    EXIT

E o arquivo File1.bat contém o seguinte código:

@echo off

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
    IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" (
>nul 2>&1 "%SYSTEMROOT%\SysWOW64\cacls.exe" "%SYSTEMROOT%\SysWOW64\config\system"
) ELSE (
>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 )
exit

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"=""
    echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit 

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"

echo This is the start of the script
echo.     
GOTO START

:START
    IF EXIST "%userprofile%\Desktop\Program.exe" (DEL "%userprofile%\Desktop\Program.exe")
    CD /D "%~dp0"
    rest of code...
O problema com esta abordagem é o fato de que, uma vez iniciado o File1.bat baixado, esse arquivo pede direitos de administrador e uma vez que eu clico em "sim" ele abre outro prompt de comando que pede direitos de administrador e isso acontece uma e outra vez, como em um loop contínuo. Se eu não pedir direitos de administrador, o arquivo funciona da maneira pretendida. Então, eu estou supondo que seja um problema de como eu estou pedindo por permissões de administrador ou como ele age em relação ao fato de que é um arquivo SFX ou pode ser algo completamente diferente.

Vocês têm alguma ideia de como fazer isso funcionar e tão eficiente quanto possível? Estou aberto a qualquer ideia, como alterar a forma como faço o download de arquivos, como solicito direitos de administrador, como não usar um arquivo SFX, mas outra coisa, etc.

Nota: Estou usando apenas winhttpjs por causa do tamanho muito pequeno do arquivo (20KB) em comparação com alternativas populares como wget ou curl e estou usando apenas para baixar alguns arquivos .bat do Google Drive, um dos sendo ele mesmo (estou usando também para baixar mais arquivos depois no script, mas isso é irrelevante). Se eu pudesse de alguma forma baixar os arquivos diretamente do arquivo run.bat sem precisar chamar winhttpjs, ou se eu pudesse modificar os winhttpjs para também baixar os 3 arquivos para que eu pudesse pular o run.bat completamente isso seria ótimo (infelizmente BITS é lento e depreciado).

    
por Claudiu Dragan 31.05.2017 / 11:38

0 respostas