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).
Invoke-WebRequest
potrebbe essere sufficiente?