Рішення Бена Гріпки викликає нескінченні петлі. Його партія працює так (псевдокод):
IF "no admin privileges?"
"write a VBS that calls this batch with admin privileges"
ELSE
"execute actual commands that require admin privileges"
Як бачите, це спричиняє нескінченний цикл, якщо VBS не вдається запитувати права адміністратора.
Однак може відбуватися нескінченний цикл, хоча адміністративні привілеї запрошені успішно.
Перевірка в пакетному файлі Бена Гріпки просто схильна до помилок. Я розігрувався з партією і помітив, що права адміністратора доступні, хоча перевірка не вдалася. Цікаво, що перевірка спрацювала, як і очікувалося, якщо я запустив пакетний файл з Windows Explorer, але він не став, коли я запустив його з моєї IDE.
Тому я пропоную використовувати два окремі пакетні файли. Перший генерує VBS, який викликає другий пакетний файл:
@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"
Другий, з назвою "my_commands.bat" і розташований у тому ж каталозі, що і перший, містить ваші фактичні команди:
pushd "%CD%"
CD /D "%~dp0"
REM Your commands which require admin privileges here
Це не викликає нескінченних циклів, а також видаляє перевірку привілеїв адміністратора, схильну до помилок.