Scarica i file dalla riga di comando in Windows + eseguendo uno di essi con privilegi di amministratore


0

Nell'ultima settimana ho provato un nuovo modo di "distribuire" una cartella sul desktop di un altro computer, scaricare un paio di file e quindi eseguirne uno come amministratore. L'unica cosa è che il file che fa tutto ciò deve essere veramente leggero, come sotto i 500 KB o giù di lì, altrimenti è inutile.

Quello che sto facendo finora è: sto usando un archivio SFX creato da WinRar chiamato Program.exe che contiene 2 file, il file run.bat e il winhttpjs.bat che utilizzo per scaricare gli altri file ( https: / /github.com/npocmaka/batch.scripts/blob/master/hybrids/jscript/winhttpjs.bat )

Run.bat contiene questo codice:

@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 il file File1.bat contiene il seguente codice:

@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...

Il problema con questo approccio è il fatto che, una volta avviato File1.bat scaricato, quel file richiede i diritti di amministratore e una volta che faccio clic su "sì", si apre un altro prompt dei comandi che richiede i diritti di amministratore e che si verifica più volte di nuovo, come in un ciclo continuo. Se non chiedo i diritti di amministratore, il file funziona esattamente come previsto. Quindi suppongo che sia un problema con il modo in cui sto chiedendo i permessi di amministratore o come agisce riguardo al fatto che si tratta di un archivio SFX o potrebbe essere completamente qualcos'altro.

Ragazzi avete idea di come farlo funzionare e quanto più efficiente possibile in termini di spazio? Sono aperto a qualsiasi idea come cambiare il modo in cui scarico i file, come chiedo i diritti di amministratore, come non usare un archivio SFX ma qualcos'altro ecc.

Nota: sto usando winhttpjs solo per le dimensioni dei file molto ridotte (20 KB) rispetto alle alternative popolari come wget o curl e lo sto usando solo per scaricare un paio di file .bat da Google Drive, uno dei quali è esso stesso (Lo sto usando per scaricare anche altri file più avanti nello script, ma questo è irrilevante). Se in qualche modo potessi scaricare i file direttamente dal file run.bat senza dover chiamare su winhttpjs, o se potessi modificare winhttpjs per scaricare anche i 3 file in modo da poter saltare del tutto run.bat sarebbe fantastico (purtroppo BITS è lento e deprecato).


Perché non usare PowerShell? Un semplice Invoke-WebRequestpotrebbe essere sufficiente?
Seth,

Powershell non è disponibile su XP, Vista, Windows 7
Claudiu Dragan,

1
Powershell 1 e sono supportati da Vista. È probabile che il tuo approccio venga rilevato come downloader generico win32 e bloccato dalla maggior parte degli antivirus.
Overmind

Sono in grado di farlo firmare digitalmente in modo che non sia un problema. Esplorerò la possibilità di utilizzare PowerShell (non sapevo che fosse disponibile su sistemi operativi più vecchi di Win8 - non riesco da parte mia) ma voglio davvero la totale compatibilità per questo, non sono sicuro che PowerShell sia la strada da percorrere.
Claudiu Dragan,

Suggerisco di usare wget, l'approccio PowerShell che è possibile, che fa quello che vuoi, non funziona con la versione di Powershell che usi su Windows XP e Windows Vista
Ramhound,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.