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

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

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

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

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

Ответ 1

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

Ответ 2

Этот трюк требует только одной команды: введите net session в командную строку.

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

От MS Technet:

Используется без параметров, сеанс сети отображает информацию обо всех сеансы с локальным компьютером.

Ответ 3

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

Ответ 4

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

Ответ 5

Самый простой способ сделать это в 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 уровня целостности: http://msdn.microsoft.com/en-us/library/bb625963.aspx

Ответ 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

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

Ответ 7

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

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)

Ответ 8

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

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

Ответ 9

Я не совсем понимаю, почему, но ни одно из других решений здесь не работало для меня. Поэтому я подумал, что стоит поделиться тем, что этот от Super User сделал трюк.

Ответ 10

решение:

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 )