Как определить в командном файле, запущен ли он c правами администратора

Приветствую тебя, уважаемый читатель. Наверняка ты уже потерявший всякую надежду на появление в этом блоге новых публикаций. Сегодня я попробую нарушить затянувшуюся паузу.

На прошедшей неделе мне довелось отправлять по почте командный файл одной особе бальзаковского возраста, которому для успешного завершения своей работы были необходимы права администратора. И в процессе диалога с ней мне неоднократно подумалось, что было бы неплохо добавить в командный файл проверку, запущен ли от имени администратора.

Недолго думая, я пришел к следующему умозаключению.

  1. В Windows Vista/7/8 есть команды, которые требуют прав администратора для своего выполнения.
  2. С незапамятных времен, ещё в замшелом MS DOS была проверка на ERRORLEVEL - код возврата отработавшей программы. И сейчас мы с вами можем проверить этот код, анализируя значение переменной окружения %errorlevel%.

Следовательно, если мы запустим что-то, что требует прав администратора, в интерпретаторе без этих прав, мы должны получить %errorlevel%, НЕ равный нулю (ибо ноль - это успешное выполнение команды).

Ну например:

Ничего сложного, не так ли?

Как вы можете видеть на скриншоте выше,

  1. Команда openfiles требует для своего выполнения прав администратора
  2. В случае успеха она возвращает ноль в переменную окружения ERRORLEVEL
  3. Если прав для её выполнения недостаточно - она возвращает в неё единицу.

Дальше - дело техники. Проверка на права администратора может выглядеть так:

[code]@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[/code]

Примечание 1. Вместо openfiles тут может быть любая другая команда, требующая эскалации привилегий. Например, там могла бы быть команда net session.

Примечание 2. 2>&1 - это перенаправление всего вывода команды, включая сообщения об ошибках (2=SDTERR, дескриптор вывода ошибок) в стандартный вывод (1=STDOUT). Сам же STDOUT мы перенаправляем в NUL. Таким образом, мы подавляем весь вывод команды, и на экране ничего не отображается.


Если вы знаете более элегантное решение задачи - прошу в комментарии.

Как определить в командном файле, запущен ли он c правами администратора: 7 комментариев

  1. Тоже самое, только с запросом в реестр и короче
    reg query «HKU\S-1-5-19»>nul 2>&1 && set isAdmin=1 || set isAdmin=0

    1. можно короче
      reg query HKU\S-1-5-19>nul 2>&1& set isAdmin=%errorlevel%

  2. М.б. это не очень элегантно, но зато снимает вопрос с инструкциями пользователю.

  3. Да, тоже очень даже интересный вариант

  4. А еще со времен Вин 2000 Сервер есть утилита fsutil:
    fsutil dirty query %systemdrive% >nul

    1. Использование fsutil — тоже вполне рабочий вариант.

Обсуждение закрыто.