Как определить, что CMD работает от имени администратора или имеет повышенные привилегии?
Внутри командного файла я хотел бы проверить, работаю ли я с правами администратора или с повышенными правами.
Имя пользователя не изменяется при выборе "Запуск от имени администратора", поэтому это не работает.
Если бы существовала универсально доступная команда, которая не имеет никакого эффекта, но требует административных привилегий, то я мог бы запустить ее и проверить код ошибки, чтобы проверить наличие привилегий. До сих пор я не нашел такой команды. Кажется, что команды, которые я нашел, возвращают один, неспецифический код ошибки, который может указывать на что угодно, и по ряду причин склонны к сбою.
Я забочусь только о Windows 7, хотя поддержка более ранних операционных систем была бы хорошей.
16 ответов
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 на основе результата, который будет использоваться вашим пакетным файлом.
Этот трюк требует только одну команду: тип net session
в командной строке.
Если вы не являетесь администратором, вы получите сообщение об отказе в доступе.
От MS Technet:
При использовании без параметров net session отображает информацию обо всех сеансах с локальным компьютером.
В значительной степени то, что другие поместили прежде, но как один вкладыш, который может быть помещен в начало пакетной команды. (Ну, обычно после @echo off.)
net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)
Мне нравится предложение 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, но я не уверен насчет более ранних версий.)
Самый простой способ сделать это в 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
Решение:
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 )
Вот небольшая модификация ответа Гарри, которая фокусируется на повышенном статусе; Я использую это в начале файла 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.
Я прочитал много (большинство?) Ответов, а затем разработал 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
Надеюсь, кто-то найдет это полезным:)
Версия "not-a-one-liner" /questions/37740190/kak-opredelit-chto-cmd-rabotaet-ot-imeni-administratora-ili-imeet-povyishennyie-privilegii/37740218#37740218
@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
Если вы работаете как пользователь с правами администратора, то переменная среды 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)
Работает для Win7 Enterprise и Win10 Enterprise
@if DEFINED SESSIONNAME (
@echo.
@echo You must right click to "Run as administrator"
@echo Try again
@echo.
@pause
@goto :EOF
)
Вот простой метод, который я использовал в Windows 7 - Windows 10. По сути, я просто использую команду "IF EXIST", чтобы проверить папку Windows\System32\WDI\LogFiles. Папка WDI существует при каждой установке Windows не менее 7 лет, и для доступа к ней требуются права администратора. В папке WDI всегда есть папка LogFiles. Таким образом, запуск "IF EXIST" в папке WDI \ LogFiles вернет true, если запускать от имени администратора, и false, если не запускать от имени администратора. Это можно использовать в командном файле для проверки уровня привилегий и перехода к любым командам, которые вы пожелаете, основываясь на этом результате.
Вот краткий пример кода:
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 может быть хорошим альтернативным кандидатом), или вы можете даже создать свой собственный специально для этого цель.
Есть два предостережения об этом методе:
Отключение UAC, скорее всего, сломает его из-за того простого факта, что все равно будет работать от имени администратора.
Попытка открыть папку WDI в проводнике Windows и затем нажать "Продолжить" при появлении запроса добавит постоянные права доступа для этой учетной записи пользователя, тем самым нарушив мой метод. Если это происходит, это можно исправить, удалив учетную запись пользователя из разрешений безопасности папки WDI. Если по какой-либо причине пользователь ДОЛЖЕН иметь возможность доступа к папке WDI с помощью проводника Windows, вам придется изменить код, чтобы проверить другую папку (как упоминалось выше, создание собственного специально для этой цели может быть хорошим выбором),
Итак, по общему признанию, мой метод не идеален, так как его можно сломать, но это относительно быстрый метод, который легко реализовать, он одинаково совместим со всеми версиями Windows 7, 8 и 10, и при условии, что я буду помнить, что упомянутые предостережения был на 100% эффективным для меня.
К сожалению, «S-1-5-32-544», предложенный другими, не является доказательством возвышения.
Windows 10 и выше, независимый от языка подход:
whoami /groups | find "S-1-16-12288"
это «высокий обязательный уровень», который фактически повышается.
Обычная командная строка:
C:\> whoami /groups | find "S-1-16-12288"
C:\>
Командная строка администратора:
C:\> whoami /groups | find "S-1-16-12288"
Mandatory Label\High Mandatory Level Label S-1-16-12288
C:\>
Для использования в файле .bat:
whoami /groups | find "S-1-16-12288" && set ELEVATED=true || set ELEVATED=false
Вы также можете использовать это из powershell:
function is_elevated() {
Param( [String] $ToGroup = "S-1-16-12288" )
return [bool] ( whoami /groups | select-string $ToGroup )
}
Например:
PS> cd c:/temp
PS> set-content is-elevated.ps1 "return [bool] ( whoami /groups | sls S-1-16-12288 )"
PS> ./is-elevated.ps1
False
PS> start -verb runas powershell.exe
...
PS C:\Windows\system32> cd \temp
PS C:\temp> ./is-elevated.ps1
True
Я знаю, что я действительно опоздал на эту вечеринку, но вот мой единственный вкладыш, чтобы определить админ-капот.
Это не зависит от уровня ошибок, просто 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" равным да или нет соответственно.
Спасибо, Торин Даркфлайт. Ваш метод — единственный, который работает для меня в Windows 11. Вот пример сценария, расширяющий ваш пост:
IF EXIST %SYSTEMROOT%\SYSTEM32\WDI\LOGFILES GOTO :Running_As_An_Admin
ECHO You are NOT an Administrator. This command requires admin rights. & Echo: & Echo Quitting......
@TIMEOUT /T 10
goto :QUIT
:Running_As_An_Admin
Echo Do Admin stuff here!!!
:QUIT