Sprawdź, czy bieżący wiersz polecenia został uruchomiony jako administrator

21

Chcę napisać skrypt, który pobiera dane od użytkowników, a następnie wprowadza zmiany w całym systemie. Potrzebuję, aby było to bardzo ogólne, ale po prostu, u góry, muszę to sprawdzić, aby sprawdzić, czy jest uruchamiane jako „Administrator”. Jeśli tak nie jest, chcę wyświetlić komunikat, który im to powie; jeśli tak, to chcę, żeby trwało dalej. Czy istnieje stały sposób na sprawdzenie tego? Nie chcę zaczynać nowej sesji jako Administrator, chcę tylko sprawdzić, czy jest ona obecnie uruchomiona jako administrator

Kanadyjczyk Luke
źródło
@ g-man, jak to się wiąże?
Kanadyjczyk Łukasz
Prosi również o polecenia, które będą się zachowywać inaczej, jeśli zostaną uruchomione jako Administrator, lub nie - a przynajmniej otrzymały je jako odpowiedzi.
G-Man,

Odpowiedzi:

15

Znaleziono to na Przepełnienie stosu :

@echo off
goto check_Permissions

:check_Permissions
echo Administrative permissions required. Detecting permissions...

net session >nul 2>&1
if %errorLevel% == 0 (
    echo Success: Administrative permissions confirmed.
) else (
    echo Failure: Current permissions inadequate.
)

pause >nul
Alex
źródło
Z jakiego powodu został usunięty?
Kanadyjczyk Łukasz
Działa to zarówno z konta administratora, jak i kiedy działam jako użytkownik ograniczony, ale wybieram „Uruchom jako administrator”
Kanadyjczyk Łukasz
2
Sam pomysł, ale stosując operatory warunkowe wykonanie: net session >nul 2>&1 && echo Success || echo Failure. Uważam, że ta kompaktowa składnia jest wygodniejsza.
dbenham
6
Wymaga to uruchomienia usługi „Serwer”.
ivan_pozdeev
8

To sprawdza wysoki poziom integralności. (działa w systemie Windows Vista i nowszych)

@echo off

whoami /groups | find "S-1-16-12288" > nul

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)
tydzień
źródło
1
whoami nie jest obsługiwany w XP moja awnser lepiej obsługuje wszystkie systemy operacyjne od Windows XP do Windows 8
Alex
1
Działa to, jeśli po prostu otworzę wiersz polecenia. Jeśli uruchomię CMD jako administrator, nadal pokazuje, że jest uruchamiany jako użytkownik
Kanadyjczyk Łukasz
2
@Alex Obsługa większej liczby systemów operacyjnych jest świetna, ale ta metoda jest bardziej niezawodna, ponieważ bezpośrednio odpytuje o uprawnienia nadane bieżącej sesji zamiast brać pod uwagę mniej wiarygodne negatywne, aby wnioskować o pozytywnych.
Iszi
2
tydzień, whoami / groups ma przypadek, w którym dostajesz błędne informacje. Zobacz stackoverflow.com/questions/4051883/...
zumalifeguard
1
Brakuje @week whoamina XP.
ivan_pozdeev
4

Wiele, wiele odpowiedzi na to i wiele innych pytań w SE ( 1 , 2 , 3, żeby wymienić tylko kilka), z których wszystkie są w ten czy inny sposób wadliwe, wyraźnie pokazały, że Windows nie zapewnia niezawodnego wbudowanego narzędzia . Czas więc wprowadzić własną wersję.

Bez dalszych brudnych hacków:

Skompiluj następujący program (instrukcje poniżej) lub uzyskaj wstępnie skompilowaną kopię . Tę czynność należy wykonać tylko raz, a następnie można skopiować .exewszystko (np. Wraz z pakietem Sysinternals ).

Kod działa w Win2k + 1 , zarówno z UAC, jak i bez UAC, domeny, grup przechodnich, cokolwiek - ponieważ używa tego samego sposobu co sam system podczas sprawdzania uprawnień. chkadminwypisuje „Admin” lub „Non-admin” i ustawia kod wyjścia odpowiednio na 0 lub 1. Wyjście można stłumić /qprzełącznikiem.

chkadmin.c:

#include <malloc.h>
#include <stdio.h>
#include <windows.h>
#pragma comment (lib,"Advapi32.lib")

int main(int argc, char** argv) {
    BOOL quiet = FALSE;
    DWORD cbSid = SECURITY_MAX_SID_SIZE;
    PSID pSid = _alloca(cbSid);
    BOOL isAdmin;

    if (argc > 1) {
        if (!strcmp(argv[1],"/q")) quiet=TRUE;
        else if (!strcmp(argv[1],"/?")) {fprintf(stderr,"Usage: %s [/q]\n",argv[0]);return 0;}
    }

    if (!CreateWellKnownSid(WinBuiltinAdministratorsSid,NULL,pSid,&cbSid)) {
        fprintf(stderr,"CreateWellKnownSid: error %d\n",GetLastError());exit(-1);}

    if (!CheckTokenMembership(NULL,pSid,&isAdmin)) {
        fprintf(stderr,"CheckTokenMembership: error %d\n",GetLastError());exit(-1);}

    if (!quiet) puts(isAdmin ? "Admin" : "Non-admin");
    return !isAdmin;
}

Aby skompilować, uruchom w wierszu polecenia zestawu Windows SDK:

cl /Ox chkadmin.c

(w przypadku korzystania z VS2012 + potrzebne są dodatkowe korekty, jeśli trzeba kierować reklamy na 2k / XP )


Metoda została udostępniona dzięki https://stackoverflow.com/questions/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908

1 MSDN twierdzi, że interfejsy API to XP +, ale to nieprawda. CheckTokenMembership wynosi 2k +, a drugi jest jeszcze starszy .

ivan_pozdeev
źródło
3

Najczystszym sposobem sprawdzenia uprawnień administratora za pomocą skryptu CMD, który znalazłem, jest mniej więcej taki:

@echo off

REM  Calling verify with no args just checks the verify flag,
REM   we use this for its side effect of setting errorlevel to zero
verify >nul

REM  Attempt to read a particular system directory - the DIR
REM   command will fail with a nonzero errorlevel if the directory is
REM   unreadable by the current process.  The DACL on the
REM   c:\windows\system32\config\systemprofile directory, by default,
REM   only permits SYSTEM and Administrators.
dir %windir%\system32\config\systemprofile >nul 2>nul

REM  Use IF ERRORLEVEL or %errorlevel% to check the result
if not errorlevel 1 echo has Admin privs
if     errorlevel 1 echo has only User privs

Ta metoda używa tylko wbudowanych plików CMD.exe, więc powinna być bardzo szybka. Sprawdza również rzeczywiste możliwości procesu, zamiast sprawdzania identyfikatorów SID lub członkostwa w grupach, dlatego testowane jest skuteczne uprawnienie. I działa to już w Windows 2003 i XP. Normalne procesy użytkownika lub procesy nieokreślone zawodzą sondę katalogu, w przypadku której powiodły się procesy administracyjne lub podwyższone.

Ten test kończy się niepowodzeniem, jeśli grupa Everyone, BUILTIN\Userslub inna podobna grupa otrzyma uprawnienia do odczytu do profilu systemowego. To prawda, że ​​jest to niestandardowa konfiguracja inna niż na komputerach skonfigurowanych jako kontrolery domeny Windows, które dają uprawnienia „NT AUTHORITY \ Authentified Users” do odczytu / wykonania pliku systemowego.

William
źródło
> sprawdź, czy VERIFY jest wyłączone. > zweryfikuj /? Informuje cmd.exe, czy należy sprawdzić, czy pliki są poprawnie zapisane na dysku. WERYFIKUJ [WŁĄCZ | OFF] Wpisz VERIFY bez parametru, aby wyświetlić bieżące ustawienie VERIFY. W jaki sposób to polecenie pomaga skryptowi?
Kanadyjczyk Łukasz
3
@Canadian Luke, Niektóre wbudowane polecenia nie usuwają poziomu błędu, jeśli nie ma błędu. W ten sposób ludzie przyzwyczaili się do usuwania poziomu błędu przy użyciu hacków takich jak verify. Zwykle używam cd .(kropka spacji cd), która ustawia poziom błędu na 0, nie wytwarza danych wyjściowych, a także jest przydatna do tworzenia pliku o zerowej długości za pośrednictwem cd . >somefile. To powiedziawszy, przetestowałem „dir” na Windows 2000, XP, Vista, 2003, 2008, 2012, 7, 8 i 10. Dla wszystkich tych „dir” wyczyści poziom błędu na 0, jeśli został ustawiony przed „reż”. Dlatego nie jestem pewien, dlaczego William użył „weryfikacji” do pierwszego wyczyszczenia poziomu błędu.
user3347790,