Как определить, работает ли 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 )