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

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

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

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

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


person Jeff    schedule 02.11.2011    source источник
comment
Один из способов взлома - это попытаться сделать echo > somefile в каталог, который потребует прав администратора. это создаст файл как побочный эффект, но вы можете проверить наличие коллизий и создать уникальное имя файла в качестве обходного пути.   -  person Marc B    schedule 02.11.2011
comment
возможный дубликат пакетного сценария: как проверить права администратора   -  person npocmaka    schedule 23.09.2014
comment
[здесь вы можете найти самоподъемный пакет] [1] [1]: stackoverflow.com/questions/4051883/   -  person Amr Ali    schedule 23.11.2014
comment
@npocmaka вопрос, который вы связали, на самом деле дублирует этот;) (2013 по сравнению с 2011 годом)   -  person Matthieu    schedule 03.10.2016


Ответы (13)


ДОБАВЛЕНИЕ: для 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 на основе результата для использования вашим пакетным файлом.

person Rushyo    schedule 02.11.2011
comment
AT-команда идеальна! Ваш гугл-фу превосходит мой гугл-фу. ;-) - person Jeff; 03.11.2011
comment
+1 @Rushyo, я немного расширил ваше решение и разместил его здесь, так как это то, что я изначально нашел. Спасибо! stackoverflow.com/questions/4051883/ - person blak3r; 25.01.2012
comment
AT не работает в Windows 8, но я нашел лучшее решение. Я разместил его как ответ на другой вопрос здесь: stackoverflow.com/questions/4051883/. - person mythofechelon; 17.08.2012
comment
Рекомендую whoami / группы | findstr / b BUILTIN \ Admin | findstr / c: Включена группа && echo У меня есть админ! - работа на 95, 98, 2000, xp, vista, 7, 8! (Из комментария мне нравится предложение Рушио об использовании AT ...) - person barwnikk; 02.09.2013
comment
barwnikk, whoami / groups имеет крайний случай, когда вы получаете неверную информацию. См. stackoverflow.com/questions/4051883/ - person zumalifeguard; 18.06.2015
comment
Мне нравится ping на замену отсутствующего sleep :) - person Matthieu; 03.10.2016
comment
поместите сценарии в текстовый файл cmd, запустите как обычно, а затем как администратор, оба создали одно и то же сообщение, что вы НЕ являетесь администратором. Выход ... - person Lin Song Yang; 16.11.2018
comment
в выигрыше 10 для меня это привело к тому, что вы НЕ являетесь администратором как в обычном, так и в расширенном командном запросе. Этот вариант действительно сработал: @echo off whoami /groups | find "S-1-16-12288" > nul if %errorlevel% == 0 ( echo Welcome, Admin ) else ( echo Get lost, User ) - person Chris L; 11.03.2020
comment
@barwnikk, это может работать на английских установках Windows. Например, здесь вам нужно найти str для чего-то вроде VORDEFINIERT\Administratoren и Aktivierte Gruppe. (хотя не проверено) - person René Nyffenegger; 15.03.2020
comment
Commad AT устарел в Windows 10. Используйте команду 'net session', см. Сообщения ниже. - person lison; 10.06.2020
comment
Для PowerShell вы также можете использовать #Requires -RunAsAdministrator в начале вашего скрипта, чтобы потребовать повышения прав. - person Ed Greaves; 18.02.2021

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

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

System error 5 has occurred.

Access is denied.

Если вы ЯВЛЯЕТЕСЬ администратором, вы получите другое сообщение, наиболее распространенное из которых:

There are no entries in the list.

Из MS Technet:

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

person Ambrose Leung    schedule 29.04.2013
comment
Функционально это идентично ответу Рушио, в котором использовалась команда AT. - person Jeff; 03.05.2013
comment
В Windows 8.1 это предпочтительнее, чем AT, поскольку AT не рекомендуется. Использование ответа Rushyo, но замена AT на net session или net.exe session отлично работает для меня. - person kayleeFrye_onDeck; 23.12.2014
comment
Кажется, это самый простой способ сделать это в командной строке (хотя и отличается от пакетного файла). - person enderland; 15.10.2015
comment
Просто печатает There are no entries in the list. в Windows 10 Pro - person gman; 17.01.2018
comment
в пакетном файле используйте что-то вроде этого: net session >nul 2>&1 || (echo not admin&goto :eof) - person anilech; 23.10.2019

Мне нравится предложение Рушио использовать 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, но я не уверен в более ранних версиях.)

person Harry Johnston    schedule 02.11.2011
comment
В польской версии у меня есть: BUILTIN \ Administratorzy, поэтому рекомендую: whoami / groups | findstr / b BUILTIN \ Admin | findstr / c: Включенная группа && goto: isadministrator - person barwnikk; 02.09.2013
comment
@barwnikk, рекомендую whoami/groups а потом вручную сканировать строки. Не займет много времени, и команда уместится в вашем мозгу. - person Pacerier; 03.02.2015
comment
@Pacerier: суть вопроса в том, чтобы определить высоту в пакетном файле. Если человек находится в командной строке, все, что ему нужно сделать, это посмотреть на заголовок окна, в котором всегда запускается «Администратор»: если у вас есть повышенные права. - person Harry Johnston; 03.02.2015
comment
@HarryJohnston, ничего себе не осознавал. Отображается ли заголовок администратора для всех версий окон? - person Pacerier; 08.02.2015
comment
@Pacerier: все текущие версии (начиная с Vista). - person Harry Johnston; 08.02.2015
comment
У whoami / groups есть крайний случай, когда вы получаете неверную информацию. См. stackoverflow.com/questions/4051883/ - person zumalifeguard; 18.06.2015
comment
@zumalifeguard: когда я его тестировал, whoami /groups дал мне правильную информацию: группа присутствует, но отключена. Мой код проверяет, включена ли группа, поэтому в вашем сценарии он не должен давать неправильный ответ. - person Harry Johnston; 19.06.2015
comment
Мне это нравится, потому что это не вызывает ошибки, если пользователь не является администратором. В событии сборки Visual Studio, если есть уровень ошибки, сборка завершится ошибкой. Этот код позволит продолжить сборку, если пользователь не является администратором. - person Michael Fitzpatrick; 20.07.2016
comment
Имейте в виду, что если у вас большой список групп, это слишком медленно, чтобы сделать это возможным. Я просто попробовал это на одной машине (Win7 в домене), и на сбор списка групп ушло почти 30 секунд. - person Euro Micelli; 30.11.2016

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

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)
person geek_01    schedule 09.08.2016
comment
Это последняя версия, и она прекрасно скрывает нерелевантный вывод net.exe. - person andersand; 19.10.2017
comment
Хорошо работает в Windows 10. - person James Pack; 14.08.2018
comment
Сработал отлично, просто настроил конец на & Timeout / t 10 & Exit / b 1), чтобы в пакетном файле окно не исчезало мгновенно. - person WhoIsRich; 23.01.2020

Самый простой способ сделать это в 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

person Martin Binder    schedule 23.07.2013
comment
У whoami / groups есть крайний случай, когда вы получаете неверную информацию. См. stackoverflow.com/questions/4051883/ - person zumalifeguard; 18.06.2015

Вот небольшая модификация ответа Гарри, которая фокусируется на повышенном статусе; Я использую это в начале файла 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.

person Hugh    schedule 13.08.2012
comment
У whoami / groups есть крайний случай, когда вы получаете неверную информацию. См. stackoverflow.com/questions/4051883/ - person zumalifeguard; 18.06.2015

решение:

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 )
person ipAlex    schedule 26.07.2017

Я прочитал много (большинство?) Ответов, а затем разработал 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

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

person GeoffH    schedule 31.12.2014
comment
У whoami / groups есть крайний случай, когда вы получаете неверную информацию. См. stackoverflow.com/questions/4051883/ - person zumalifeguard; 18.06.2015
comment
Спасибо тебе за это! Другое решение whoami не сработало для меня в Windows 8.1. Этот сделал. - person Ryan; 24.11.2016

"Не-однострочная" версия https://stackoverflow.com/a/38856823/2193477

@echo off
net.exe session 1>NUL 2>NUL || goto :not_admin
echo SUCCESS
goto :eof

:not_admin
echo ERROR: Please run as a local administrator.
exit /b 1
person tivnet    schedule 17.01.2018

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

Он не полагается на уровень ошибки, только на 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» равным да или нет соответственно.

person user1    schedule 11.05.2013
comment
Это будет работать, только если пользователь является прямым членом локальной группы администраторов. Если пользователь является членом группы домена (например, администраторов домена), которая является членом группы администраторов, это не сработает. - person Harry Johnston; 19.06.2015

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

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)
person englebart    schedule 06.01.2020

Если вы работаете как пользователь с правами администратора, тогда переменная среды 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)

person Wolfgang    schedule 20.03.2020

Вот простой метод, который я использовал в Windows 7 - Windows 10. Обычно я просто использую команду «ЕСЛИ СУЩЕСТВУЕТ» для проверки папки 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% эффективным для меня.

person Torin Darkflight    schedule 06.10.2018