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

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

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

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

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

Ответы [ 11 ]

70 голосов
/ 29 апреля 2013

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

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

С MS Technet :

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

54 голосов
/ 02 ноября 2011

ADDENDUM : для 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-файл, основанный на результате использования вашего командного файла.

25 голосов
/ 03 ноября 2011

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

16 голосов
/ 09 августа 2016

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

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)
10 голосов
/ 23 июля 2013

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

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

7 голосов
/ 13 августа 2012

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

6 голосов
/ 26 июля 2017

решение:

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 )
6 голосов
/ 31 декабря 2014

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

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

2 голосов
/ 17 января 2018

Версия "не один лайнер" 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
1 голос
/ 11 мая 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...