Jak wykryć, czy CMD działa jako administrator / ma podwyższone uprawnienia?

101

Z wnętrza pliku wsadowego chciałbym sprawdzić, czy pracuję z uprawnieniami administratora / podwyższonymi.

Nazwa użytkownika nie zmienia się po wybraniu opcji „Uruchom jako administrator”, więc to nie działa.

Gdyby istniało powszechnie dostępne polecenie, które nie ma żadnego skutku, ale wymaga uprawnień administratora, mógłbym je uruchomić i sprawdzić, czy nie ma kodu błędu, aby przetestować uprawnienia. Do tej pory nie znalazłem takiego polecenia. Polecenia, które znalazłem, wydają się zwracać pojedynczy, niespecyficzny kod błędu, który może wskazywać cokolwiek, i są podatne na awarie z różnych powodów.

Zależy mi tylko na Windows 7, chociaż obsługa wcześniejszych systemów operacyjnych byłaby fajna.

Jeff
źródło
Jedną z hacków byłaby próba echo > somefilewejścia do katalogu, który wymagałby uprawnień administratora. dałoby to plik jako efekt uboczny, ale możesz sprawdzić, czy nie ma kolizji i utworzyć unikalną nazwę pliku jako obejście.
Marc B
1
[można znaleźć pakiet samoczynnie podnoszący się tutaj] [1] [1]: stackoverflow.com/questions/4051883/…
Amr Ali
1
@npocmaka - pytanie, które połączyłeś, jest w rzeczywistości duplikatem tego;) (2013 vs 2011)
Matthieu,

Odpowiedzi:

62

DODATEK : W systemie Windows 8 to nie zadziała; zamiast tego zobacz tę doskonałą odpowiedź .


Znalazłem to rozwiązanie tutaj: 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
)

Zakładając, że to nie zadziała, a ponieważ mówimy o Win7, możesz użyć następującego programu w Powershell, jeśli jest to odpowiednie:

$principal = new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())
$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)

Jeśli nie (i prawdopodobnie nie, ponieważ jawnie zaproponowałeś pliki wsadowe), możesz napisać powyższe w .NET i zwrócić kod zakończenia z exe na podstawie wyniku do użycia przez plik wsadowy.

Rushyo
źródło
4
Polecenie AT jest doskonałe! Twoje Google-fu jest lepsze od mojego Google-fu. ;-)
Jeff
2
+1 @Rushyo, nieco rozszerzyłem twoje rozwiązanie i opublikowałem je tutaj, ponieważ to jest to, na które pierwotnie się natknąłem. Dzięki! stackoverflow.com/questions/4051883/…
blak3r
16
ATnie działa na Windows 8, ale znalazłem lepsze rozwiązanie. Opublikowałem to jako odpowiedź na inne pytanie, tutaj: stackoverflow.com/questions/4051883/… .
mythofechelon
4
Polecam whoami / grup | findstr / b BUILTIN \ Admin | findstr / c: "Włączona grupa" && echo "Mam administratora!" - pracuj na 95, 98, 2000, xp, vista, 7, 8! (Z komentarza "Lubię sugestie Rushyo o używaniu AT ...")
barwnikk
1
Lubię pingwymienić brakujące sleep:)
Matthieu
96

Ta sztuczka wymaga tylko jednego polecenia: wpisz net sessionw wierszu polecenia.

Jeśli NIE jesteś administratorem , otrzymasz wiadomość o odmowie dostępu.

System error 5 has occurred.

Access is denied.

Jeśli jesteś administratorem , otrzymujesz inną wiadomość, najczęściej:

There are no entries in the list.

Z MS Technet :

Używana bez parametrów sesja sieciowa wyświetla informacje o wszystkich sesjach z komputerem lokalnym.

Ambrose Leung
źródło
Jest to funkcjonalnie identyczne z odpowiedzią Rushyo, która użyła polecenia AT.
Jeff
12
W systemie Windows 8.1 jest to preferowane rozwiązanie niż AT, ponieważ AT jest przestarzałe. Korzystanie odpowiedź Rushyo, ale podstawiając AT z sesji netto lub sesji Net.exe działa idealnie dla mnie.
kayleeFrye_onDeck
Wydaje się, że jest to najłatwiejszy sposób na zrobienie tego w wierszu polecenia (który jednak różni się od pliku wsadowego).
enderland
2
Po prostu drukuje There are no entries in the list.w systemie Windows 10 Pro
gman
1
w pliku wsadowym użyj czegoś takiego:net session >nul 2>&1 || (echo not admin&goto :eof)
anilech
27

Podoba mi się sugestia Rushyo dotycząca korzystania z AT, ale to jest inna opcja:

whoami /groups | findstr /b BUILTIN\Administrators | findstr /c:"Enabled group" && goto :isadministrator

Takie podejście pozwoliłoby również na rozróżnienie między administratorem niebędącym administratorem a administratorem bez podwyższonego poziomu uprawnień, gdybyś chciał. Administratorzy bez uprawnień nadal mają BUILTIN \ Administrators na liście grup, ale nie jest ona włączona.

Jednak to nie zadziała w niektórych systemach językowych innych niż angielski. Zamiast tego spróbuj

whoami /groups | findstr /c:" S-1-5-32-544 " | findstr /c:" Enabled group" && goto :isadministrator

(To powinno działać w systemie Windows 7, ale nie jestem pewien co do wcześniejszych wersji).

Harry Johnston
źródło
1
W polskiej wersji mam: BUILTIN \ Administratorzy, więc polecam: whoami / groups | findstr / b BUILTIN \ Admin | findstr / c: "Włączona grupa" && goto: isadministrator
barwnikk
@barwnikk, polecam, whoami/groupsa potem ręczne skanowanie wierszy. Nie zajęłoby to zbyt dużo czasu, a polecenie pasuje do twojego mózgu.
Pacerier
@Pacerier: chodzi o wykrycie wysokości w pliku wsadowym . Jeśli ktoś jest w wierszu poleceń, wystarczy spojrzeć na tytuł okna, które zawsze uruchamia „Administrator:”, jeśli masz uprawnienia.
Harry Johnston
@HarryJohnston, Wow nie zdawałem sobie z tego sprawy. Czy tytuł „Administrator” pojawia się we wszystkich wersjach systemu Windows?
Pacerier,
@Pacerier: wszystkie aktualne wersje (od Vista).
Harry Johnston,
24

Prawie to, co inni umieścili wcześniej, ale jako jedna linijka, którą można umieścić na początku polecenia wsadowego. (Cóż, zwykle po wyłączeniu @echo.)

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)
geek_01
źródło
2
To jest aktualna wersja i ładnie ukrywa nieistotne dane wyjściowe z pliku net.exe
andersand
2
Działa dobrze w systemie Windows 10.
James Pack,
Działało świetnie, po prostu dostosowałem koniec do & Timeout / t 10 & Exit / b 1), aby w pliku wsadowym okno nie znikało natychmiast.
WhoIsRich
12

Najłatwiejszym sposobem na to w systemie Vista, Win 7 i nowszych jest wyliczenie grup tokenów i wyszukanie aktualnego poziomu integralności (lub adresu administratora, jeśli ważne jest tylko członkostwo w grupie):

Sprawdź, czy biegamy na podwyższonym poziomie:

whoami /groups | find "S-1-16-12288" && Echo I am running elevated, so I must be an admin anyway ;-)

Sprawdź, czy należymy do lokalnych administratorów:

whoami /groups | find "S-1-5-32-544" && Echo I am a local admin

Sprawdź, czy należymy do administratorów domeny:

whoami /groups | find "-512 " && Echo I am a domain admin

Poniższy artykuł zawiera listę identyfikatorów SID na poziomie integralności używanych w systemie Windows: http://msdn.microsoft.com/en-us/library/bb625963.aspx

Martin Binder
źródło
whoami / groups ma skrajny przypadek, w którym otrzymujesz błędne informacje. Zobacz stackoverflow.com/questions/4051883/…
zumalifeguard
7

Oto niewielka modyfikacja odpowiedzi Harry'ego, która koncentruje się na podwyższonym statusie; Używam tego na początku pliku 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
)

To zdecydowanie zadziałało i zasada wydaje się być rozsądna; od Chrisa Jacksona z MSFT :

Kiedy masz podwyższony poziom, twój token zawiera ACE o nazwie Mandatory Label \ High Mandatory Level.

Hugh
źródło
whoami / groups ma skrajny przypadek, w którym otrzymujesz błędne informacje. Zobacz stackoverflow.com/questions/4051883/…
zumalifeguard
7

rozwiązanie:

at >nul
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )

nie działa pod Windows 10

dla wszystkich wersji systemu Windows można to zrobić:

openfiles >nul 2>&1
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )
ipAlex
źródło
6

Przeczytałem wiele (większość?) Odpowiedzi, a następnie opracowałem plik bat, który działa dla mnie w Win 8.1. Pomyślałem, że się tym podzielę.

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

Mam nadzieję, że ktoś uzna to za przydatne :)

GeoffH
źródło
whoami / groups ma skrajny przypadek, w którym otrzymujesz błędne informacje. Zobacz stackoverflow.com/questions/4051883/…
zumalifeguard
Dziękuję Ci za to! Inne rozwiązanie "whoami" nie działało dla mnie na Windows 8.1. Ten zrobił.
Ryan
1

Wiem, że jestem naprawdę spóźniony na tę imprezę, ale oto moja jedna linijka do ustalenia administracji.

Nie polega na poziomie błędu, tylko na 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%)

Zwraca tak lub nie, w zależności od statusu administratora użytkownika ...

Ustawia również wartość zmiennej „admin” odpowiednio na tak lub nie.

użytkownik1
źródło
To zadziała tylko wtedy, gdy użytkownik jest bezpośrednim członkiem lokalnej grupy Administratorzy. Jeśli użytkownik jest członkiem grupy domeny (np. „Administratorzy domeny”), która jest członkiem grupy Administratorzy, nie będzie działać.
Harry Johnston
1

Jeśli pracujesz jako użytkownik z prawami administratora, zmienna środowiskowa SessionName NIE zostanie zdefiniowana i nadal nie masz uprawnień administratora podczas uruchamiania pliku wsadowego.

Powinieneś użyć polecenia „net session” i poszukać kodu powrotu błędu „0”, aby zweryfikować uprawnienia administratora.

Przykład; - pierwsza instrukcja echa to znak dzwonka 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)

Wolfgang
źródło
0

Oto prosta metoda, której używałem w systemach Windows 7 do Windows 10. Po prostu używam polecenia „IF EXIST”, aby sprawdzić folder Windows \ System32 \ WDI \ LogFiles. Folder WDI istnieje w każdej instalacji systemu Windows począwszy od co najmniej 7 i wymaga uprawnień administratora, aby uzyskać do niego dostęp. Folder WDI zawsze zawiera folder LogFiles. Zatem uruchomienie „IF EXIST” w folderze WDI \ LogFiles zwróci wartość „prawda”, jeśli jest uruchomiona jako administrator, i „fałsz”, jeśli nie zostanie uruchomiona jako administrator. Można tego użyć w pliku wsadowym, aby sprawdzić poziom uprawnień i przejść do dowolnych poleceń na podstawie tego wyniku.

Oto krótki fragment przykładowego kodu:

IF EXIST %SYSTEMROOT%\SYSTEM32\WDI\LOGFILES GOTO GOTADMIN
(Commands for running with normal privileges)

:GOTADMIN
(Commands for running with admin privileges)

Należy pamiętać, że ta metoda zakłada, że ​​domyślne uprawnienia zabezpieczeń nie zostały zmodyfikowane w folderze WDI (co jest mało prawdopodobne w większości sytuacji, ale należy zapoznać się z zastrzeżeniem nr 2 poniżej). Nawet w takim przypadku wystarczy zmodyfikować kod, aby sprawdzić, czy nie ma innego wspólnego pliku / folderu, który wymaga dostępu administratora (System32 \ config \ SAM może być dobrym alternatywnym kandydatem) lub możesz nawet utworzyć własny specjalnie do tego celu cel, powód.

Istnieją jednak dwa zastrzeżenia dotyczące tej metody:

  1. Wyłączenie UAC prawdopodobnie przełamie ten prosty fakt, że i tak wszystko zostanie uruchomione jako administrator.

  2. Próba otwarcia folderu WDI w Eksploratorze Windows, a następnie kliknięcie przycisku „Kontynuuj” po wyświetleniu monitu spowoduje dodanie stałych praw dostępu do tego konta użytkownika, łamiąc w ten sposób moją metodę. W takim przypadku można to naprawić, usuwając konto użytkownika z uprawnień zabezpieczeń folderu WDI. Jeśli z jakiegoś powodu użytkownik MUSI mieć dostęp do folderu WDI za pomocą Eksploratora Windows, musiałbyś zmodyfikować kod, aby sprawdzić inny folder (jak wspomniano powyżej, utworzenie własnego specjalnie w tym celu może być dobrym wyborem) .

Tak więc, co prawda, moja metoda nie jest idealna, ponieważ można ją zepsuć, ale jest to stosunkowo szybka metoda, która jest łatwa do wdrożenia, jest równie kompatybilna ze wszystkimi wersjami Windows 7, 8 i 10 i pod warunkiem, że będę pamiętać o wspomnianych zastrzeżeniach był dla mnie w 100% skuteczny.

Torin Darkflight
źródło
0

Działa dla Win7 Enterprise i Win10 Enterprise

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)
englebart
źródło