La solución de Ben Gripka provoca bucles infinitos. Su lote funciona así (pseudocódigo):
IF "no admin privileges?"
"write a VBS that calls this batch with admin privileges"
ELSE
"execute actual commands that require admin privileges"
Como puede ver, esto provoca un bucle infinito, si el VBS falla al solicitar privilegios de administrador.
Sin embargo, el ciclo infinito puede ocurrir, aunque los privilegios de administrador se han solicitado con éxito.
La verificación en el archivo por lotes de Ben Gripka es propensa a errores. Jugué con el lote y observé que los privilegios de administrador están disponibles aunque la verificación falló. Curiosamente, la verificación funcionó como se esperaba, si comencé el archivo por lotes desde el explorador de Windows, pero no lo hizo cuando lo inicié desde mi IDE.
Así que sugiero usar dos archivos por lotes separados. El primero genera el VBS que llama al segundo archivo por lotes:
@echo off
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params = %*:"=""
echo UAC.ShellExecute "cmd.exe", "/c ""%~dp0\my_commands.bat"" %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
El segundo, llamado "my_commands.bat" y ubicado en el mismo directorio que el primero contiene sus comandos reales:
pushd "%CD%"
CD /D "%~dp0"
REM Your commands which require admin privileges here
Esto no provoca bucles infinitos y también elimina la comprobación de privilegios de administrador propensa a errores.