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

103

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

Имя пользователя не меняется при выборе «Запуск от имени администратора», поэтому это не работает.

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

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

Джефф
источник
Один из способов взлома - это попытаться сделать и сделать echo > somefileв каталоге, который потребует прав администратора. это создаст файл как побочный эффект, но вы можете проверить наличие коллизий и создать уникальное имя файла в качестве обходного пути.
Marc B
1
[вы можете найти партию самоподъема здесь] [1] [1]: stackoverflow.com/questions/4051883/…
Амр Али
1
@npocmaka, вопрос, который вы связали, на самом деле является дубликатом этого;) (2013 по сравнению с 2011 годом)
Матье

Ответы:

64

ДОБАВЛЕНИЕ : Для Windows 8 это не сработает; вместо этого см. этот отличный ответ .


Нашел это решение здесь: http://www.robvanderwoude.com/clevertricks.php

AT > NUL
IF %ERRORLEVEL% EQU 0 (
    ECHO you are Administrator
) ELSE (
    ECHO you are NOT Administrator. Exiting...
    PING 127.0.0.1 > NUL 2>&1
    EXIT /B 1
)

Предполагая, что это не работает, и поскольку мы говорим о Win7, вы можете использовать в Powershell следующее, если это подходит:

$principal = new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())
$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)

Если нет (и, вероятно, нет, поскольку вы явно предложили пакетные файлы), вы можете написать это в .NET и вернуть код выхода из exe на основе результата для использования вашим пакетным файлом.

Рушио
источник
4
AT-команда идеальна! Ваш гугл-фу превосходит мой гугл-фу. ;-)
Джефф
2
+1 @Rushyo, я немного расширил ваше решение и разместил его здесь, так как это тот, с которым я изначально столкнулся. Спасибо! stackoverflow.com/questions/4051883/…
blak3r
16
ATне работает в Windows 8, но я нашел лучшее решение. Я разместил его как ответ на другой вопрос здесь: stackoverflow.com/questions/4051883/… .
мифофехелон
4
Рекомендую whoami / группы | findstr / b BUILTIN \ Admin | findstr / c: "Включенная группа" && echo "У меня есть админ!" - работа на 95, 98, 2000, xp, vista, 7, 8! (Из комментария «Мне нравится предложение Рушио об использовании AT ...»)
barwnikk
1
Мне нравится pingзаменять отсутствующие sleep:)
Matthieu
96

Для этого трюка требуется только одна команда: введите net sessionв командной строке.

Если вы НЕ являетесь администратором , вы получите сообщение об отказе в доступе.

System error 5 has occurred.

Access is denied.

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

There are no entries in the list.

Из MS Technet :

При использовании без параметров сетевой сеанс отображает информацию обо всех сеансах с локальным компьютером.

Амвросий Люн
источник
Функционально это идентично ответу Рушио, в котором использовалась команда AT.
Джефф
12
В Windows 8.1 это предпочтительнее, чем AT, так как AT не рекомендуется. Используя ответ Rushyo, но подставляя AT с чистой сессии или net.exe сессии отлично работает для меня.
kayleeFrye_onDeck
Кажется, это самый простой способ сделать это из командной строки (хотя и отличается от пакетного файла).
Enderland
2
Просто печатает There are no entries in the list.в Windows 10 Pro
gman
1
в пакетном файле используйте что-то вроде этого:net session >nul 2>&1 || (echo not admin&goto :eof)
anilech
27

Мне нравится предложение Рашио использовать AT, но это еще один вариант:

whoami /groups | findstr /b BUILTIN\Administrators | findstr /c:"Enabled group" && goto :isadministrator

Этот подход также позволит вам различать неадминистратора и администратора без повышенных прав, если вы захотите. Администраторы без повышенных прав по-прежнему имеют BUILTIN \ Administrators в списке групп, но он не включен.

Однако это не будет работать в некоторых системах, отличных от английского. Вместо этого попробуйте

whoami /groups | findstr /c:" S-1-5-32-544 " | findstr /c:" Enabled group" && goto :isadministrator

(Это должно работать в Windows 7, но я не уверен в более ранних версиях.)

Гарри Джонстон
источник
1
В польской версии у меня: BUILTIN \ Administratorzy, поэтому рекомендую: whoami / groups | findstr / b BUILTIN \ Admin | findstr / c: "Включенная группа" && goto: isadministrator
barwnikk
@barwnikk, рекомендую whoami/groupsа потом строчки вручную сканировать. Не займет много времени, и команда поместится в вашем мозгу.
Pacerier
@Pacerier: суть вопроса в том, чтобы определить высоту в пакетном файле . Если человек находится в командной строке, все, что ему нужно сделать, это посмотреть на заголовок окна, который всегда запускает «Администратор:», если у вас есть повышенные права.
Гарри Джонстон
@HarryJohnston, ничего себе не понял. Отображается ли заголовок «Администратор» для всех версий окон?
Pacerier
@Pacerier: все текущие версии (начиная с Vista).
Гарри Джонстон
25

В значительной степени то, что другие ставили раньше, но как один лайнер, который можно поместить в начало пакетной команды. (Ну, обычно после @echo off.)

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)
geek_01
источник
2
Это последняя версия, и она прекрасно скрывает нерелевантный вывод net.exe
andersand
2
Хорошо работает в Windows 10.
Джеймс Пак,
Сработал отлично, просто настроил конец на & Timeout / t 10 & Exit / b 1), чтобы в пакетном файле окно не исчезало мгновенно.
WhoIsRich
12

Самый простой способ сделать это в Vista, Win 7 и выше - это перечислить группы токенов и найти текущий уровень целостности (или sid администратора, если важно только членство в группе):

Проверьте, работает ли мы на повышенном уровне:

whoami /groups | find "S-1-16-12288" && Echo I am running elevated, so I must be an admin anyway ;-)

Проверим, принадлежим ли мы к локальным администраторам:

whoami /groups | find "S-1-5-32-544" && Echo I am a local admin

Проверяем, принадлежим ли мы к администраторам домена:

whoami /groups | find "-512 " && Echo I am a domain admin

В следующей статье перечислены идентификаторы безопасности, используемые окнами уровня целостности: http://msdn.microsoft.com/en-us/library/bb625963.aspx

Мартин Биндер
источник
У whoami / groups есть крайний случай, когда вы получаете неверную информацию. См stackoverflow.com/questions/4051883/...
zumalifeguard
7

Вот небольшая модификация ответа Гарри, которая фокусируется на повышенном статусе; Я использую это в начале файла install.bat:

set IS_ELEVATED=0
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" | findstr /c:"Enabled group" > nul: && set IS_ELEVATED=1
if %IS_ELEVATED%==0 (
    echo You must run the command prompt as administrator to install.
    exit /b 1
)

Это определенно сработало для меня, и принцип кажется правильным; от Криса Джексона из MSFT :

Когда вы работаете с повышенными правами, ваш токен содержит ACE под названием Mandatory Label \ High Mandatory Level.

Хью
источник
У whoami / groups есть крайний случай, когда вы получаете неверную информацию. См stackoverflow.com/questions/4051883/...
zumalifeguard
7

решение:

at >nul
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )

не работает под Windows 10

для всех версий Windows можно сделать так:

openfiles >nul 2>&1
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )
ipAlex
источник
6

Я прочитал много (большинство?) Ответов, а затем разработал bat-файл, который у меня работает в Win 8.1. Думал, что поделюсь этим.

setlocal
set runState=user
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" > nul && set runState=admin
whoami /groups | findstr /b /c:"Mandatory Label\System Mandatory Level" > nul && set runState=system
echo Running in state: "%runState%"
if not "%runState%"=="user" goto notUser
  echo Do user stuff...
  goto end
:notUser
if not "%runState%"=="admin" goto notAdmin
  echo Do admin stuff...
  goto end
:notAdmin
if not "%runState%"=="system" goto notSystem
  echo Do admin stuff...
  goto end
:notSystem
echo Do common stuff...
:end

Надеюсь, кто-то сочтет это полезным :)

Джефф
источник
У whoami / groups есть крайний случай, когда вы получаете неверную информацию. См stackoverflow.com/questions/4051883/...
zumalifeguard
Спасибо тебе за это! Другое решение "whoami" у меня не сработало в Windows 8.1. Этот сделал.
Райан
1

Я знаю, что очень опаздываю на эту вечеринку, но вот моя единственная подсказка, чтобы определить админку.

Он не полагается на уровень ошибок, а только на systeminfo:

for /f "tokens=1-6" %%a in ('"net user "%username%" | find /i "Local Group Memberships""') do (set admin=yes & if not "%%d" == "*Administrators" (set admin=no) & echo %admin%)

Он возвращает либо да, либо нет, в зависимости от статуса администратора пользователя ...

Он также устанавливает значение переменной «admin» равным да или нет соответственно.

user1
источник
Это будет работать, только если пользователь является прямым членом локальной группы администраторов. Если пользователь является членом группы домена (например, «Администраторы домена»), которая является членом группы администраторов, это не сработает.
Гарри Джонстон
1

Если вы работаете как пользователь с правами администратора, тогда переменная среды SessionName НЕ будет определена, и у вас все еще нет прав администратора при запуске командного файла.

Вы должны использовать команду «net session» и искать код возврата ошибки «0», чтобы проверить права администратора.

Пример; - первый оператор эха - это символ звонка net session >nul 2>&1 if not %errorlevel%==0 (echo echo You need to start over and right-click on this file, echo then select "Run as administrator" to be successfull. echo.&pause&exit)

Вольфганг
источник
0

Вот простой метод, который я использовал в Windows 7 - Windows 10. Обычно я просто использую команду «IF EXIST» для проверки папки Windows \ System32 \ WDI \ LogFiles. Папка WDI существует при каждой установке Windows как минимум с 7 и далее, и для доступа к ней требуются права администратора. В папке WDI всегда есть папка LogFiles. Таким образом, запуск «ЕСЛИ СУЩЕСТВУЕТ» в папке WDI \ LogFiles вернет истину, если запускается от имени администратора, и ложь, если запускается не от имени администратора. Это можно использовать в пакетном файле для проверки уровня привилегий и перехода к любым командам, которые вы хотите, на основе этого результата.

Вот краткий фрагмент примера кода:

IF EXIST %SYSTEMROOT%\SYSTEM32\WDI\LOGFILES GOTO GOTADMIN
(Commands for running with normal privileges)

:GOTADMIN
(Commands for running with admin privileges)

Имейте в виду, что этот метод предполагает, что разрешения безопасности по умолчанию для папки WDI не были изменены (что маловероятно в большинстве ситуаций, но см. Предостережение № 2 ниже). Даже в этом случае достаточно просто изменить код, чтобы проверить наличие другого общего файла / папки, требующего доступа администратора (System32 \ config \ SAM может быть хорошим альтернативным кандидатом), или вы даже можете создать свой собственный специально для этого цель.

Однако есть два предостережения относительно этого метода:

  1. Отключение UAC, скорее всего, нарушит тот простой факт, что в любом случае все будет запускаться от имени администратора.

  2. Попытка открыть папку WDI в проводнике Windows и затем щелкнуть «Продолжить» при появлении запроса добавит постоянные права доступа для этой учетной записи пользователя, что нарушит мой метод. Если это произойдет, это можно исправить, удалив учетную запись пользователя из разрешений безопасности папки WDI. Если по какой-либо причине пользователь ДОЛЖЕН иметь доступ к папке WDI с помощью проводника Windows, вам придется изменить код, чтобы проверить другую папку (как упоминалось выше, создание собственной папки специально для этой цели может быть хорошим выбором) .

Итак, по общему признанию, мой метод не идеален, так как его можно сломать, но это относительно быстрый метод, который легко реализовать, он в равной степени совместим со всеми версиями Windows 7, 8 и 10, и при условии, что я помню упомянутые предостережения, был на 100% эффективным для меня.

Торин Даркфлайт
источник
0

Работает для Win7 Enterprise и Win10 Enterprise

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)
Englebart
источник