Приветствую тебя, уважаемый читатель. Наверняка ты уже потерявший всякую надежду на появление в этом блоге новых публикаций. Сегодня я попробую нарушить затянувшуюся паузу.
На прошедшей неделе мне довелось отправлять по почте командный файл одной особе бальзаковского возраста, которому для успешного завершения своей работы были необходимы права администратора. И в процессе диалога с ней мне неоднократно подумалось, что было бы неплохо добавить в командный файл проверку, запущен ли от имени администратора.
Недолго думая, я пришел к следующему умозаключению.
- В Windows Vista/7/8 есть команды, которые требуют прав администратора для своего выполнения.
- С незапамятных времен, ещё в замшелом MS DOS была проверка на ERRORLEVEL - код возврата отработавшей программы. И сейчас мы с вами можем проверить этот код, анализируя значение переменной окружения %errorlevel%.
Следовательно, если мы запустим что-то, что требует прав администратора, в интерпретаторе без этих прав, мы должны получить %errorlevel%, НЕ равный нулю (ибо ноль - это успешное выполнение команды).
Ну например:
Как вы можете видеть на скриншоте выше,
- Команда openfiles требует для своего выполнения прав администратора
- В случае успеха она возвращает ноль в переменную окружения ERRORLEVEL
- Если прав для её выполнения недостаточно - она возвращает в неё единицу.
Дальше - дело техники. Проверка на права администратора может выглядеть так:
@echo off
openfiles > NUL 2>&1
if NOT %ERRORLEVEL% EQU 0 goto NotAdmin
echo Hello from elevated command prompt
goto End
:NotAdmin
echo This command prompt is NOT ELEVATED
:End
Примечание 1. Вместо openfiles тут может быть любая другая команда, требующая эскалации привилегий. Например, там могла бы быть команда net session.
Примечание 2. 2>&1 - это перенаправление всего вывода команды, включая сообщения об ошибках (2=SDTERR, дескриптор вывода ошибок) в стандартный вывод (1=STDOUT). Сам же STDOUT мы перенаправляем в NUL. Таким образом, мы подавляем весь вывод команды, и на экране ничего не отображается.
Если вы знаете более элегантное решение задачи - прошу в комментарии.
💡Узнавайте о новых статьях быстрее. Подпишитесь на наши каналы в Telegram и Twitter.
Тоже самое, только с запросом в реестр и короче
reg query «HKU\S-1-5-19»>nul 2>&1 && set isAdmin=1 || set isAdmin=0
Неплохо!
можно короче
reg query HKU\S-1-5-19>nul 2>&1& set isAdmin=%errorlevel%
М.б. это не очень элегантно, но зато снимает вопрос с инструкциями пользователю.
Да, тоже очень даже интересный вариант
А еще со времен Вин 2000 Сервер есть утилита fsutil:
fsutil dirty query %systemdrive% >nul
Использование fsutil — тоже вполне рабочий вариант.