Як визначити, чи працює CMD як адміністратор / має підвищені привілеї?


101

Зсередини пакетного файлу я хотів би перевірити, чи працюю я з правами адміністратора / підвищеними.

Ім'я користувача не змінюється, якщо вибрано "Запустити як адміністратор", тому це не працює.

Якби була загальнодоступна команда, яка не має ефекту, але вимагає адміністративних привілеїв, то я міг би запустити це і перевірити код помилки, щоб перевірити наявність привілеїв. Поки що я не знайшов такої команди. Знайдені нами команди повертають єдиний неспецифічний код помилки, який міг би вказувати на що завгодно, і вони з різних причин схильні до відмови.

Мене хвилює тільки Windows 7, хоча підтримка більш ранніх операційних систем була б непоганою.


Один злом слід спробувати зробити echo > somefileв каталозі, який вимагатиме адміністраторських приватних даних. він створить файл як побічний ефект, але ви можете перевірити на предмет зіткнень та створити унікальне ім'я файлу як вирішення.
Марк Б


1
[Ви можете знайти самопідйомну партію тут] [1] [1]: stackoverflow.com/questions/4051883/…
Amr Ali


1
@npocmaka питання, яке ви пов’язали, насправді є дублікатом цього;) (2013 р. проти 2011 р.)
Матьє

Відповіді:


62

ДОДАТОК : Для 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, виходячи з результату, який використовуватиме ваш пакетний файл.


4
Команда AT ідеально! Ваш Google-фу перевершує мій Google-фу. ;-)
Джефф

2
+1 @Rushyo, я трохи розширив ваше рішення і розмістив його тут, оскільки це саме те, що я спочатку натрапив. Дякую! stackoverflow.com/questions/4051883 / ...
blak3r

16
ATне працює в Windows 8, але я знайшов краще рішення. Я опублікував це як відповідь на інше запитання, тут: stackoverflow.com/questions/4051883/… .
mythofechelon

4
Я рекомендую whoami / групи | findstr / b BUILTIN \ Адміністратор | findstr / c: "Увімкнена група" && echo "У мене є адміністратор!" - робота над 95, 98, 2000, xp, vista, 7, 8! (З коментаря "Мені подобається судженість Рушіо щодо використання AT ...")
barwnikk

1
Мені подобається pingзамінити відсутні sleep:)
Matthieu

96

Цей фокус вимагає лише однієї команди: введіть net sessionу командний рядок.

Якщо ви НЕ адміністратор , ви отримуєте доступ до повідомлення відмовлено.

System error 5 has occurred.

Access is denied.

Якщо ви адміністратор , ви отримуєте інше повідомлення, найпоширенішим з яких є:

There are no entries in the list.

Від MS Technet :

Чистий сеанс використовується без параметрів, відображає інформацію про всі сеанси на локальному комп'ютері.


Це функціонально ідентично відповіді Рушіо, яка використовувала команду AT.
Джефф

12
У Windows 8.1 це віддається перевазі AT, оскільки AT застаріло. Використання відповіді Rushyo, але заміна AT на сесії net або net.exe для мене прекрасно працює.
kayleeFrye_onDeck

Це здається найпростішим способом зробити це в командному рядку (який, однак, відрізняється від пакетного файлу).
Ендерленд

2
Щойно друкує There are no entries in the list.в програмі Windows 10 Pro
gman

1
у пакетному файлі використовуйте щось подібне:net session >nul 2>&1 || (echo not admin&goto :eof)
anilech

27

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


1
У польській версії у мене є: BUILTIN \ Administratorzy, тому рекомендую: whoami / groups | findstr / b BUILTIN \ Адміністратор | findstr / c: "Увімкнена група" && goto: isadministrator
barwnikk

@barwnikk, я рекомендую whoami/groupsі потім сканувати лінії вручну. Не займе багато часу, і команда впишеться у ваш мозок.
Pacerier

@Pacerier: суть питання полягає у виявленні висоти у пакетному файлі . Якщо людина знаходиться в командному рядку, все, що їм потрібно зробити, - це подивитися на назву вікна, яке завжди починається з "Адміністратора:", якщо ви підвищені.
Гаррі Джонстон

@HarryJohnston, Нічого цього не усвідомлював. Чи відображається назва "Адміністратор" для всіх версій Windows?
Pacerier

@Pacerier: всі поточні версії (Vista далі).
Гаррі Джонстон

24

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

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

2
Це найновіша версія, і вона добре приховує невідповідний вихід з net.exe
andersand

2
Добре працює в Windows 10.
James Pack

Працювало чудово, просто підключив кінець до & Timeout / t 10 & Exit / b 1), щоб у пакетному файлі вікно не миттєво зникло.
WhoIsRich

12

Найпростіший спосіб зробити це на Vista, Win 7 і вище - це перерахування токенових груп та пошук поточного рівня цілісності (або адміністраторів, якщо має значення лише членство в групі):

Перевірте, чи бігаємо ми підвищено:

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


whoami / groups має кращий випадок, коли ви отримуєте неправильну інформацію. Див stackoverflow.com/questions/4051883 / ...
zumalifeguard

7

Ось невелика модифікація відповіді Гаррі, яка зосереджена на підвищеному статусі; Я використовую це на початку файла 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 під назвою "Обов'язкова мітка \ високий обов'язковий рівень".


whoami / groups має кращий випадок, коли ви отримуєте неправильну інформацію. Див stackoverflow.com/questions/4051883 / ...
zumalifeguard

7

рішення:

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

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

Сподіваюся, хтось вважає це корисним :)


whoami / groups має кращий випадок, коли ви отримуєте неправильну інформацію. Див stackoverflow.com/questions/4051883 / ...
zumalifeguard

Дякую за це! Інші рішення "whoami" не працювали для мене в Windows 8.1. Цей і зробив.
Райан


1

Я знаю, що я дуже спізнююся на цю вечірку, але ось мій один лайнер, щоб визначити адміністратор-капот.

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


Це буде працювати лише в тому випадку, якщо користувач є безпосереднім членом локальної групи адміністраторів. Якщо користувач є членом доменної групи (наприклад, "Адміністратори домену"), що є членом групи "Адміністратори", він не працюватиме.
Гаррі Джонстон

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)


0

Ось простий метод, який я використовував у Windows 7 та Windows 10. В основному я просто використовую команду "ЯКЩО Є Є" для перевірки папки 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 може бути хорошим альтернативним кандидатом), або ви навіть можете створити свій власний спеціально для цього призначення.

Існує два застереження щодо цього методу:

  1. Відключення UAC, ймовірно, порушить його через простий факт, що все одно буде працювати як адміністратор.

  2. Спроба відкрити папку WDI в Провіднику Windows, а потім натиснути «Продовжити», коли буде запропоновано, додадуть постійні права доступу до цього облікового запису користувача, таким чином порушуючи мій метод. Якщо це станеться, це можна виправити, видаливши обліковий запис користувача із дозволів безпеки папки WDI. Якщо з будь-якої причини користувач ПОВИНЕН мати можливість отримати доступ до папки WDI за допомогою Провідника Windows, то вам доведеться змінити код, щоб перевірити іншу папку (як зазначено вище, створення власної спеціально для цієї мети може бути хорошим вибором) .

Тож, правда, мій метод не є ідеальним, оскільки його можна зламати, але це досить швидкий метод, який легко реалізувати, однаково сумісний із усіма версіями Windows 7, 8 та 10, і за умови, що я пам'ятаю про згадані застереження. була на 100% ефективна для мене.


0

Працює для Win7 Enterprise та Win10 Enterprise

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.