Пакетный скрипт: как проверить права администратора - PullRequest
252 голосов
/ 29 октября 2010

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

Я знаю, как заставить его вызывать себя с помощью runas, но не знаю, как проверить права администратора. Единственные решения, которые я видел, - это грубые хакерские задания или использование внешних программ. Ну, на самом деле мне все равно, если это хакерская работа, если она работает на Windows XP и новее.

Ответы [ 27 ]

423 голосов
/ 17 августа 2012

Проблемы

blak3r / Rushyo Решение отлично работает для всех, кроме Windows 8. Запуск AT в Windows 8 приводит к:

The AT command has been deprecated. Please use schtasks.exe instead.

The request is not supported.

(см. Скриншот № 1) и вернет %errorLevel% 1.

Research

Итак, я пошел искать другие команды, которые требуютповышенные разрешения. rationallyparanoid.com имел список из нескольких, поэтому я запускал каждую команду на двух противоположных крайностях текущих операционных систем Windows (XP и 8) в надежде найти команду, которой будет отказано в доступе в обеих ОС.при запуске со стандартными разрешениями.

В конце концов я нашел один - NET SESSION. true , чистое, универсальное решение, которое не включает:

  • создание или взаимодействие с данными в безопасных местах
  • анализ данных, возвращаемых с FOR loop
  • поиск строк «Администратор»
  • с использованием AT (несовместимо с Windows 8) или WHOAMI (несовместимо с Windows XP).

Каждый из них имеет свои собственные проблемы безопасности, удобства использования и переносимости.

Тестирование

Я независимо подтвердил, что это работаетна:

  • Windows XP, x86
  • Windows XP, x64
  • Windows Vista, x86
  • Windows Vista, x64
  • Windows 7, x86
  • Windows 7, x64
  • Windows 8, x86
  • Windows 8, x64

(см. Скриншот № 2)

Реализация / использование

Итак, чтобы использовать это решение, просто сделайте что-то вроде этого:

@echo off
goto check_Permissions

:check_Permissions
    echo Administrative permissions required. Detecting permissions...

    net session >nul 2>&1
    if %errorLevel% == 0 (
        echo Success: Administrative permissions confirmed.
    ) else (
        echo Failure: Current permissions inadequate.
    )

    pause >nul

Доступно здесь, если выlazy: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat

Пояснение

NET SESSION - это стандартная команда, используемая для "управления подключениями к серверу. При использовании без параметров отображается [it]информация о всех сеансах с локальным компьютером. "

Итак, вот основной процесс моей данной реализации:

  1. @echo off
    • Отключить отображениеизкоманды
  2. goto check_Permissions
    • Перейти к :check_Permissions блоку кода
  3. net session >nul 2>&1
    • Выполнить команду
    • Скрыть визуальный вывод команды с помощью
      1. Перенаправление потока стандартного вывода (числовой дескриптор 1 / STDOUT) на nul
      2. Перенаправление вывода стандартной ошибкипоток (числовой дескриптор 2 / STDERR) к тому же назначению, что и числовой дескриптор 1
  4. if %errorLevel% == 0
    • Если значениекод выхода (%errorLevel%) равен 0, тогда это означает, что ошибок не возникло и, следовательно, предыдущая команда немедленно выполнила успешно
  5. else
    • Если значение кода выхода (%errorLevel%) не равно 0, то это означает, что ошибки имеютпроизошло и, следовательно, предыдущая немедленная команда выполнила безуспешно
  6. Код в скобках будет выполнен в зависимости от wчто соответствует критериям

Скриншоты

Windows 8 AT %errorLevel%:

[imgur]

NET SESSION в Windows XP x86 - Windows 8 x64 :

[imgur]

Спасибо, @Tilka, за изменение принятого ответа на мой.:)

74 голосов
/ 25 января 2012

Решение Андерса сработало для меня, но я не был уверен, как инвертировать его, чтобы получить противоположность (когда вы не были администратором).

Вот мое решение.У него есть два случая IF и ELSE, а также несколько примеров ascii, чтобы люди действительно читали его.:)

Минимальная версия

Rushyo разместил это решение здесь: Как определить, работает ли CMD от имени администратора или имеет повышенные привилегии?

NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
    ECHO NOT AN ADMIN!
)

Версия, которая добавляет сообщения об ошибках, паузы и выходы

@rem ----[ This code block detects if the script is being running with admin PRIVILEGES If it isn't it pauses and then quits]-------
echo OFF
NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
   echo ######## ########  ########   #######  ########  
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ######   ########  ########  ##     ## ########  
   echo ##       ##   ##   ##   ##   ##     ## ##   ##   
   echo ##       ##    ##  ##    ##  ##     ## ##    ##  
   echo ######## ##     ## ##     ##  #######  ##     ## 
   echo.
   echo.
   echo ####### ERROR: ADMINISTRATOR PRIVILEGES REQUIRED #########
   echo This script must be run as administrator to work properly!  
   echo If you're seeing this after clicking on a start menu icon, then right click on the shortcut and select "Run As Administrator".
   echo ##########################################################
   echo.
   PAUSE
   EXIT /B 1
)
@echo ON

Работает на WinXP -> Win8 (включая 32/64 битные версии).

РЕДАКТИРОВАТЬ: 8 /28/2012 Обновлено для поддержки Windows 8. @BenHooper указал на это в своем ответе ниже.Пожалуйста, подтвердите его ответ.

37 голосов
/ 23 января 2014

Больше вопросов

Как указал @Lectrode, если вы попытаетесь запустить команду net session, когда служба сервера остановлена, вы получите следующее сообщение об ошибке:

The Server service is not started.

More help is available by typing NET HELPMSG 2114

В этом случае переменная %errorLevel% будет установлена ​​на 2.

Примечание Служба сервера не запущена в безопасном режиме (с сетью или без нее).

В поисках альтернативы

То, что:

  • может быть запущен из коробки в Windows XP и более поздних версиях (32- и 64-разрядных);
  • не касается реестра или каких-либо системных файлов / папок;
  • работает независимо от локали системы;
  • дает правильные результаты даже в безопасном режиме.

Итак, я загрузил виртуальную виртуальную машину Windows XP и начал просматривать список приложений в папке C:\Windows\System32, пытаясь найти некоторые идеи. После проб и ошибок вот такой грязный (каламбур) подход, который я придумал:

fsutil dirty query %systemdrive% >nul

Команде fsutil dirty требуются права администратора для запуска, в противном случае произойдет сбой. %systemdrive% - это переменная среды , которая возвращает букву диска, на котором установлена ​​операционная система. Выход перенаправляется на nul, поэтому игнорируется. Переменная %errorlevel% будет установлена ​​на 0 только после успешного выполнения.

Вот что говорится в документации:

Fsutil dirty

Запрашивает или устанавливает грязный бит тома. Если установлен грязный бит тома, autochk автоматически проверяет громкость на наличие ошибок при следующей перезагрузке компьютера.

Синтаксис

fsutil dirty {query | set} <VolumePath>

Параметры

query           Queries the specified volume's dirty bit.
set             Sets the specified volume's dirty bit.
<VolumePath>    Specifies the drive name followed by a colon or GUID.

Примечания

Грязный бит тома указывает, что файловая система может находиться в несогласованном состоянии. Грязный бит может быть установлен, потому что:

  • Том в сети, и он имеет значительные изменения.
  • Изменения были внесены в том, и компьютер был выключен до того, как изменения были зафиксированы на диске.
  • На томе обнаружено повреждение.

Если грязный бит установлен при перезагрузке компьютера, chkdsk запускается, чтобы проверить целостность файловой системы и попытаться исправить любые проблемы с томом.

Примеры * * 1 077 Чтобы запросить грязный бит на диске C, введите: fsutil dirty query C:

Дальнейшие исследования

Хотя вышеприведенное решение работает с Windows XP и далее, стоит добавить, что Windows 2000 и Windows PE (предустановленная среда) не поставляются с fsutil.exe, поэтому мы должны прибегнуть к чему-то еще.

Во время моих предыдущих тестов я заметил, что выполнение команды sfc без каких-либо параметров приведет либо к:

  • ошибка, если у вас недостаточно прав;
  • список доступных параметров и их использование.

То есть: без параметров, без партии . Идея состоит в том, что мы можем проанализировать вывод и проверить, не получили ли мы что-либо, кроме ошибки:

sfc 2>&1 | find /i "/SCANNOW" >nul

Выход ошибки сначала перенаправляется на стандартный вывод, который затем передается команде find. На данный момент мы должны искать параметр only , который поддерживается во всех версиях Windows начиная с Windows 2000: /SCANNOW. В поиске не учитывается регистр, а вывод отбрасывается путем перенаправления его на nul.

Вот выдержка из документации:

Sfc

Сканирует и проверяет целостность всех защищенных системных файлов и заменяет неправильные версии правильными версиями.

Примечания

Для запуска sfc.exe .

вы должны войти в систему как член группы администраторов.

Пример использования

Вот несколько примеров вставки и запуска:

Windows XP и более поздние версии

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
fsutil dirty query %systemdrive% >nul
exit /b

Windows 2000 / Windows PE

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
sfc 2>&1 | find /i "/SCANNOW" >nul
exit /b

Относится к

  • Windows 2000
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
  • Windows 8.1
    ---
  • Windows PE
17 голосов
/ 29 октября 2010
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)
17 голосов
/ 02 февраля 2015

еще один способ

fltmc >nul 2>&1 && (
  echo has admin permissions
) || (
  echo has NOT admin permissions
)
Команда

fltmc доступна в любой системе Windows начиная с XP, поэтому она должна быть довольно переносимой.


Еще одно решение, протестированное на XP, 8.1, 7 (к сожалению, не работает на всех win10 машинах - см. Комментарии.) - есть одна конкретная переменная =::, которая отображается только в том случае, если Консольный сеанс не имеет прав администратора. Поскольку не так просто создать переменную, содержащую в своем имени =, это сравнительно надежный способ проверки прав администратора (и довольно быстрый, поскольку он не вызывает внешние исполняемые файлы)

setlocal enableDelayedExpansion
set "dv==::"
if defined !dv! ( 
   echo has NOT admin permissions
) else (
   echo has admin permissions
)
14 голосов
/ 17 июня 2014

альтернативное решение:

@echo off
pushd %SystemRoot%
openfiles.exe 1>nul 2>&1
if not %errorlevel% equ 0 (
    Echo here you are not administrator!
) else (
    Echo here you are administrator!
)
popd
Pause
13 голосов
/ 06 февраля 2013

Не только проверка, но и автоматическое получение прав администратора
aka Automatic UAC для Win 7/8 / 8.1 и т. д.
: Ниже приведен действительно интересный вариант с еще одной функцией: этот пакетный фрагмент не только проверяет права администратора, но и получает их автоматически! (и тестирует раньше, если живет на ОС с поддержкой UAC.)

С помощью этого трюка вам больше не нужно нажимать правую кнопку мыши на вашем командном файле "с правами администратора". Если вы забыли, чтобы запустить его с повышенными правами, UAC появится автоматически! Более того, сначала тестируется, если ОС требует / предоставляет UAC, поэтому она ведет себя правильно, например, для Win 2000 / XP до Win 8.1 - проверено.

@echo off
REM Quick test for Windows generation: UAC aware or not ; all OS before NT4 ignored for simplicity
SET NewOSWith_UAC=YES
VER | FINDSTR /IL "5." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO
VER | FINDSTR /IL "4." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO


REM Test if Admin
CALL NET SESSION >nul 2>&1
IF NOT %ERRORLEVEL% == 0 (

    if /i "%NewOSWith_UAC%"=="YES" (
        rem Start batch again with UAC
        echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
        echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
        "%temp%\getadmin.vbs"
        del "%temp%\getadmin.vbs"
        exit /B
    )

    rem Program will now start again automatically with admin rights! 
    rem pause
    goto :eof
)

Фрагмент объединяет несколько хороших шаблонов пакетов, особенно (1) тест администратора в этой теме, выполненный Беном Хупером, и (2) активация UAC, прочитанная на BatchGotAdmin и цитируемая на сайте пакетной обработки robvanderwoude (уважение). (3) Для идентификации ОС по «VER | FINDSTR pattern» я просто не нахожу ссылку.)

(Что касается некоторых очень незначительных ограничений, когда «NET SESSION» не работает, как упомянуто в другом ответе, не стесняйтесь вставлять еще одну из этих команд. Для меня работа в безопасном режиме Windows или специальные стандартные службы отключены, и такие не являются важные варианты использования - для некоторых администраторов, возможно, они есть.)

11 голосов
/ 27 апреля 2013

У меня есть два способа проверки привилегированного доступа, оба довольно надежны и очень переносимы практически во всех версиях Windows.

1.Метод

set guid=%random%%random%-%random%-%random%-%random%-%random%%random%%random%

mkdir %WINDIR%\%guid%>nul 2>&1
rmdir %WINDIR%\%guid%>nul 2>&1

IF %ERRORLEVEL%==0 (
    ECHO PRIVILEGED!
) ELSE (
    ECHO NOT PRIVILEGED!
)

Это один из самых надежных методов из-за его простоты, и поведение этой очень примитивной команды вряд ли изменится.Это не относится к другим встроенным инструментам CLI, таким как net session , которые можно отключить с помощью политик администратора / сети, или к командам, подобным fsutils , которые изменили вывод в Windows 10.

* Работает на XP и более поздних версиях

2.Метод

REG ADD HKLM /F>nul 2>&1

IF %ERRORLEVEL%==0 (
    ECHO PRIVILEGED!
) ELSE (
    ECHO NOT PRIVILEGED!
)

Иногда вам не нравится идея трогать диск пользователя, даже если он настолько же безобиден, как использование fsutils или создание пустой папки, если он недоказуем, но может привести ккатастрофическая ошибка, если что-то пойдет не так.В этом сценарии вы можете просто проверить реестр на наличие привилегий.

Для этого вы можете попробовать создать ключ на HKEY_LOCAL_MACHINE , используя разрешения по умолчанию, которые вы получите Доступ запрещен и ERRORLEVEL == 1, но если вы запускаете от имени администратора, он напечатает «команда выполнена успешно» и ERRORLEVEL == 0.Поскольку ключ уже существует, он не влияет на реестр.Это, вероятно, самый быстрый способ, и REG существует в течение длительного времени.

* Его нет в pre NT (Win 9X).

* Работает на XP и более поздних версиях


Рабочий пример

Сценарий, который очищает временную папку

@echo off
:main
    echo.
    echo. Clear Temp Files script
    echo.

    call :requirePrivilegies

    rem Do something that require privilegies

    echo. 
    del %temp%\*.*
    echo. End!

    pause>nul
goto :eof


:requirePrivilegies
    set guid=%random%%random%-%random%-%random%-%random%-%random%%random%%random%
    mkdir %WINDIR%\%guid%>nul 2>&1
    rmdir %WINDIR%\%guid%>nul 2>&1
    IF NOT %ERRORLEVEL%==0 (
        echo ########## ERROR: ADMINISTRATOR PRIVILEGES REQUIRED ###########
        echo # This script must be run as administrator to work properly!  #
        echo # Right click on the script and select "Run As Administrator" #
        echo ###############################################################
        pause>nul
        exit
    )
goto :eof
6 голосов
/ 07 сентября 2016

Самый чистый способ проверки прав администратора с помощью сценария CMD, который я обнаружил, выглядит примерно так:

@echo off

REM  Calling verify with no args just checks the verify flag,
REM   we use this for its side effect of setting errorlevel to zero
verify >nul

REM  Attempt to read a particular system directory - the DIR
REM   command will fail with a nonzero errorlevel if the directory is
REM   unreadable by the current process.  The DACL on the
REM   c:\windows\system32\config\systemprofile directory, by default,
REM   only permits SYSTEM and Administrators.
dir %windir%\system32\config\systemprofile >nul 2>nul

REM  Use IF ERRORLEVEL or %errorlevel% to check the result
if not errorlevel 1 echo has Admin privs
if     errorlevel 1 echo has only User privs

Этот метод использует только встроенные CMD.exe, поэтому он должен быть очень быстрым,Он также проверяет действительные возможности процесса, а не проверяет SID или членство в группах, поэтому проверяется разрешение эффективное .И это работает еще в Windows 2003 и XP.Обычные пользовательские процессы или процессы без прав доступа не проходят проверку каталога, где успешно выполняются процессы администратора или повышенные права.

5 голосов
/ 11 января 2019

В пакетном скрипте Elevate.cmd (см. эта ссылка ), который я написал получить права администратора , я сделали это следующим образом:

:checkPrivileges
  NET FILE 1>NUL 2>NUL
  if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )

Это протестировано для Windows 7, 8, 8.1, 10 и даже Windows XP и не требует каких-либо ресурсов, таких как специальный каталог, файл или раздел реестра.

...