В течение последней недели я пробовал новый способ "развернуть" папку на рабочем столе другого компьютера, загрузить в нее пару файлов и запустить один из них с правами администратора. Единственное, что файл, который делает все это, должен быть очень легким, примерно до 500 КБ или около того, иначе он бесполезен.

Что я делаю до сих пор: я использую созданный WinRar SFX-архив с именем Program.exe, который содержит 2 файла: файл run.bat и файл winhttpjs.bat, который я использую для загрузки других файлов (https://github.com/npocmaka/batch.scripts/blob/master/hybrids/jscript/winhttpjs.bat)

Run.bat содержит этот код:

@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

И файл File1.bat содержит следующий код:

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

Проблема этого подхода заключается в том, что после запуска загруженного File1.bat этот файл запрашивает права администратора, а когда я нажимаю "да", он просто открывает другую командную строку, в которой запрашиваются права администратора, и это происходит снова и снова. опять же, как в непрерывном цикле. Если я не запрашиваю права администратора, файл работает так, как задумано. Поэтому я предполагаю, что это либо проблема с тем, как я запрашиваю разрешения администратора, либо как он действует в отношении того факта, что это архив SFX, или это может быть что-то совсем другое.

Ребята, у вас есть идеи, как сделать это максимально эффективным и экономным? Я открыт для любых идей, таких как изменение способа загрузки файлов, как запрашивать права администратора, как не использовать архив SFX, а что-то еще и т.д.

Примечание: я использую только winhttpjs из-за очень маленького размера файла (20 КБ) по сравнению с популярными альтернативами, такими как wget или curl, и я использую его только для загрузки пары файлов .bat с Google Диска, один из которых сам по себе (Я использую его также для загрузки дополнительных файлов позже в сценарии, но это не имеет значения). Если бы я мог каким-то образом загрузить файлы непосредственно из файла run.bat без необходимости вызывать winhttpjs, или если бы я мог изменить winhttpjs, чтобы также загрузить 3 файла, чтобы я мог вообще пропустить run.bat, это было бы здорово (к сожалению, BITS медленный и не рекомендуется).

0