在 Windows 中从命令行下载文件 + 以管理员权限运行其中一个

在 Windows 中从命令行下载文件 + 以管理员权限运行其中一个

过去一周左右,我一直在尝试一种新方法,将文件夹“部署”到另一台计算机的桌面,下载几个文件到其中,然后以管理员身份运行其中一个。唯一的问题是,执行所有这些操作的文件必须非常轻量,比如小于 500KB 左右,否则它就毫无用处。

我目前所做的是:我正在使用 WinRar 创建的名为 Program.exe 的 SFX 存档,其中包含 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,是因为与 wget 或 curl 等流行替代方案相比,它的文件大小非常小(20KB),而且我只使用它从 Google Drive 下载几个 .bat 文件,其中一个就是它本身(我稍后还会在脚本中使用它下载更多文件,但那无关紧要)。如果我能以某种方式直接从 run.bat 文件下载文件而无需调用 winhttpjs,或者如果我可以修改 winhttpjs 以下载这 3 个文件,这样我就可以完全跳过 run.bat,那就太好了(不幸的是,BITS 很慢且已被弃用)。

相关内容