В течение последней недели я пробовал новый способ "развернуть" папку на рабочем столе другого компьютера, загрузить в нее пару файлов и запустить один из них с правами администратора. Единственное, что файл, который делает все это, должен быть очень легким, примерно до 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 медленный и не рекомендуется).