A solução de Ben Gripka causa loops infinitos. Seu lote funciona assim (pseudo-código):
IF "no admin privileges?"
"write a VBS that calls this batch with admin privileges"
ELSE
"execute actual commands that require admin privileges"
Como você pode ver, isso causa um loop infinito, se o VBS falhar ao solicitar privilégios de administrador.
No entanto, o loop infinito pode ocorrer, embora os privilégios de administrador tenham sido solicitados com êxito.
A verificação no arquivo em lotes de Ben Gripka é propensa a erros. Eu brinquei com o lote e observei que os privilégios de administrador estão disponíveis, embora a verificação falhe. Curiosamente, a verificação funcionou como esperado, se eu iniciasse o arquivo em lotes no Windows Explorer, mas não funcionou quando iniciei no IDE.
Então, sugiro usar dois arquivos em lotes separados. O primeiro gera o VBS que chama o segundo arquivo em lote:
@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"
O segundo, chamado "my_commands.bat" e localizado no mesmo diretório que o primeiro, contém seus comandos reais:
pushd "%CD%"
CD /D "%~dp0"
REM Your commands which require admin privileges here
Isso não causa loops infinitos e também remove a verificação de privilégios de administrador propensa a erros.