Главная > Без вредных советов, Уголок гика > Как определить в командном файле, запущен ли он c правами администратора

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

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

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

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

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

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

Ну например:

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

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

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

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

@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. Таким образом, мы подавляем весь вывод команды, и на экране ничего не отображается.


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

Winreview.ru можно найти в Вконтакте, Facebook и Twitter. Присоединяйтесь!

Комментарии

  1. Степан

    Тоже самое, только с запросом в реестр и короче

    reg query "HKU\S-1-5-19">nul 2>&1 && set isAdmin=1 || set isAdmin=0

  2. Сергей Ткаченко

    @Степан
    Неплохо!

  3. Вадим Стеркин

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

  4. Сергей Ткаченко

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

  5. Ruslan

    @Степан
    можно короче

    reg query HKU\S-1-5-19>nul 2>&1& set isAdmin=%errorlevel%

  6. Евгений

    А еще со времен Вин 2000 Сервер есть утилита fsutil

    fsutil dirty query %systemdrive% >nul

  7. Сергей Ткаченко

    @Евгений
    Использование fsutil - тоже вполне рабочий вариант.

Написать комментарий