Giải pháp của Ben Gripka gây ra các vòng lặp vô hạn. Lô của anh ta hoạt động như thế này (mã giả):
IF "no admin privileges?"
"write a VBS that calls this batch with admin privileges"
ELSE
"execute actual commands that require admin privileges"
Như bạn có thể thấy, điều này gây ra một vòng lặp vô hạn, nếu VBS không yêu cầu đặc quyền quản trị viên.
Tuy nhiên, vòng lặp vô hạn có thể xảy ra, mặc dù quyền riêng tư của quản trị viên đã được yêu cầu thành công.
Việc kiểm tra tệp bó của Ben Gripka chỉ dễ bị lỗi. Tôi đã chơi xung quanh với lô và nhận thấy rằng các đặc quyền quản trị viên có sẵn mặc dù kiểm tra không thành công. Thật thú vị, kiểm tra hoạt động như mong đợi, nếu tôi bắt đầu tệp bó từ windows explorer, nhưng nó không hoạt động khi tôi khởi động nó từ IDE của mình.
Vì vậy, tôi đề nghị sử dụng hai tập tin lô riêng biệt. Cái đầu tiên tạo VBS gọi tệp bó thứ hai:
@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"
Cái thứ hai, được đặt tên là "my_commands.bat" và nằm trong cùng thư mục với cái đầu tiên chứa các lệnh thực tế của bạn:
pushd "%CD%"
CD /D "%~dp0"
REM Your commands which require admin privileges here
Điều này gây ra không có vòng lặp vô hạn và cũng loại bỏ kiểm tra đặc quyền quản trị dễ bị lỗi.