Come rilevare se CMD è in esecuzione come amministratore / ha privilegi elevati?


101

Dall'interno di un file batch, vorrei verificare se sono in esecuzione con privilegi di amministratore / elevati.

Il nome utente non cambia quando è selezionato "Esegui come amministratore", quindi non funziona.

Se ci fosse un comando universalmente disponibile, che non ha effetto, ma richiede privilegi amministrativi, allora potrei eseguirlo e verificare la presenza di un codice di errore per testare i privilegi. Finora non ho trovato un comando del genere. I comandi che ho trovato sembrano restituire un unico codice di errore non specifico, che potrebbe indicare qualsiasi cosa e sono soggetti a errori per una serie di motivi.

Mi interessa solo Windows 7, anche se il supporto dei sistemi operativi precedenti sarebbe bello.


Un hack dovrebbe essere provato e fatto echo > somefilein una directory che richiederebbe i privati ​​dell'amministratore. produrrebbe un file come effetto collaterale, ma potresti verificare la presenza di collisioni e creare un nome file univoco come soluzione alternativa.
Marc B


1
[puoi trovare un batch auto-elevante qui] [1] [1]: stackoverflow.com/questions/4051883/…
Amr Ali


1
@npocmaka la domanda che hai collegato è in realtà il duplicato di questa;) (2013 vs 2011)
Matthieu

Risposte:


62

ADDENDUM : per Windows 8 questo non funzionerà; guarda invece questa eccellente risposta .


Ho trovato questa soluzione qui: 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
)

Supponendo che non funzioni e poiché stiamo parlando di Win7, potresti utilizzare quanto segue in Powershell se è adatto:

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

In caso contrario (e probabilmente no, dato che hai proposto esplicitamente file batch), potresti scrivere quanto sopra in .NET e restituire un codice di uscita da un exe basato sul risultato da utilizzare per il tuo file batch.


4
Il comando AT è perfetto! Il tuo Google-fu è superiore al mio Google-fu. ;-)
Jeff

2
+1 @ Rushyo, ho esteso un po 'la tua soluzione e l'ho pubblicata qui poiché è quella che ho trovato inizialmente. Grazie! stackoverflow.com/questions/4051883/...
blak3r

16
ATnon funziona su Windows 8, ma ho trovato una soluzione migliore. L'ho pubblicato come risposta a un'altra domanda, qui: stackoverflow.com/questions/4051883/… .
mythofechelon

4
Raccomando whoami / gruppi | findstr / b BUILTIN \ Admin | findstr / c: "Gruppo abilitato" && echo "Ho un amministratore!" - lavora su 95, 98, 2000, xp, vista, 7, 8! (Dal commento "Mi piace il suggerimento di Rushyo di usare AT ...")
barwnikk

1
Mi piace la pingsostituzione mancante sleep:)
Matthieu

96

Questo trucco richiede solo un comando: digita net sessionnel prompt dei comandi.

Se NON sei un amministratore , ricevi un messaggio di accesso negato.

System error 5 has occurred.

Access is denied.

Se SEI un amministratore , ricevi un messaggio diverso, il più comune è:

There are no entries in the list.

Da MS Technet :

Utilizzato senza parametri, net session visualizza le informazioni su tutte le sessioni con il computer locale.


Funzionalmente è identico alla risposta di Rushyo, che utilizzava il comando AT.
Jeff

12
Su Windows 8.1, questo è preferito ad AT, poiché AT è deprecato. Utilizzando la risposta di Rushyo ma sostituendo AT con net session o net.exe, funziona perfettamente per me.
kayleeFrye_onDeck

Questo sembra il modo più semplice per farlo sul prompt dei comandi (che è diverso dal file batch, però).
enderland

2
There are no entries in the list.
Stampa

1
in un file batch usa qualcosa del genere:net session >nul 2>&1 || (echo not admin&goto :eof)
anilech

27

Mi piace il suggerimento di Rushyo di usare AT, ma questa è un'altra opzione:

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

Questo approccio consentirebbe anche di distinguere tra un non amministratore e un amministratore non con privilegi elevati, se lo desideri. Gli amministratori non con privilegi elevati hanno ancora BUILTIN \ Administrators nell'elenco dei gruppi ma non è abilitato.

Tuttavia, questo non funzionerà su alcuni sistemi in lingua diversa dall'inglese. Invece, prova

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

(Questo dovrebbe funzionare su Windows 7 ma non sono sicuro delle versioni precedenti.)


1
Nella versione polacca, ho: BUILTIN \ Administratorzy, quindi consiglio: whoami / groups | findstr / b BUILTIN \ Admin | findstr / c: "Enabled group" && goto: isadministrator
barwnikk

@barwnikk, mi raccomando whoami/groupse quindi scansiona le linee manualmente. Non ci vorrebbe troppo tempo e il comando si inserisce nel tuo cervello.
Pacerier

@Pacerier: il punto della domanda è rilevare l'elevazione in un file batch . Se una persona è alla riga di comando, tutto ciò che deve fare è guardare il titolo della finestra, che inizia sempre "Amministratore:" se sei elevato.
Harry Johnston

@HarryJohnston, Wow non lo sapeva. Il titolo "Amministratore" viene visualizzato per tutte le versioni di Windows?
Pacerier

@Pacerier: tutte le versioni attuali (Vista in poi).
Harry Johnston

24

Più o meno quello che altri hanno messo prima, ma come una riga che può essere inserita all'inizio di un comando batch. (Beh, di solito dopo la disattivazione di @echo.)

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

2
Questa è la versione aggiornata e nasconde bene l'output irrilevante di net.exe
andersand

2
Funziona bene su Windows 10.
James Pack

Ha funzionato alla grande, ho appena modificato la fine in & Timeout / t 10 & Exit / b 1) in modo che in un file batch la finestra non scompaia immediatamente.
WhoIsRich

12

Il modo più semplice per farlo su Vista, Win 7 e versioni successive è enumerare i gruppi di token e cercare il livello di integrità corrente (o il sid degli amministratori, se è importante solo l'appartenenza al gruppo):

Controlla se stiamo eseguendo elevati:

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

Controlla se apparteniamo ad amministratori locali:

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

Controlla se apparteniamo ad amministratori di dominio:

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

Il seguente articolo elenca il livello di integrità SID utilizzato da Windows: http://msdn.microsoft.com/en-us/library/bb625963.aspx


whoami / groups ha un caso limite in cui ottieni le informazioni sbagliate. Vedere stackoverflow.com/questions/4051883/...
zumalifeguard

7

Ecco una leggera modifica della risposta di Harry che si concentra sullo stato elevato; Lo sto usando all'inizio di un file 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
)

Questo ha sicuramente funzionato per me e il principio sembra essere valido; da Chris Jackson di MSFT :

Quando esegui con privilegi elevati, il tuo token contiene un ACE denominato Etichetta obbligatoria \ Livello obbligatorio alto.


whoami / groups ha un caso limite in cui ottieni le informazioni sbagliate. Vedere stackoverflow.com/questions/4051883/...
zumalifeguard

7

la soluzione:

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

non funziona con Windows 10

per tutte le versioni di Windows è possibile farlo:

openfiles >nul 2>&1
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )

6

Ho letto molte (la maggior parte?) Delle risposte, quindi ho sviluppato un file bat che funziona per me in Win 8.1. Ho pensato di condividerlo.

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

Spero che qualcuno lo trovi utile :)


whoami / groups ha un caso limite in cui ottieni le informazioni sbagliate. Vedere stackoverflow.com/questions/4051883/...
zumalifeguard

Grazie per questo! L'altra soluzione "whoami" non ha funzionato per me su Windows 8.1. Questo lo ha fatto.
Ryan


1

So di essere davvero in ritardo per questa festa, ma ecco la mia unica battuta per determinare il livello di amministrazione.

Non si basa sul livello di errore, ma solo su 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%)

Restituisce sì o no, a seconda dello stato di amministratore dell'utente ...

Imposta anche il valore della variabile "admin" in modo che sia uguale a sì o no di conseguenza.


Funzionerà solo se l'utente è un membro diretto del gruppo locale degli amministratori. Se l'utente è un membro di un gruppo di dominio (ad esempio, "Domain Admins") che è un membro del gruppo Administrators, non funzionerà.
Harry Johnston

1

Se si esegue come utente con diritti di amministratore, la variabile di ambiente SessionName NON verrà definita e non si dispone ancora dei diritti di amministratore quando si esegue un file batch.

È necessario utilizzare il comando "net session" e cercare un codice di errore di ritorno "0" per verificare i diritti di amministratore.

Esempio; - la prima istruzione echo è il carattere campanello 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

Ecco un metodo semplice che ho utilizzato da Windows 7 a Windows 10. Fondamentalmente, utilizzo semplicemente il comando "IF EXIST" per controllare la cartella Windows \ System32 \ WDI \ LogFiles. La cartella WDI è presente in ogni installazione di Windows da almeno 7 in poi e richiede i privilegi di amministratore per accedere. La cartella WDI ha sempre una cartella LogFiles al suo interno. Quindi, l'esecuzione di "IF EXIST" nella cartella WDI \ LogFiles restituirà true se eseguito come amministratore e false se non eseguito come amministratore. Questo può essere utilizzato in un file batch per controllare il livello di privilegio e passare ai comandi desiderati in base a quel risultato.

Ecco un breve snippet di codice di esempio:

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

:GOTADMIN
(Commands for running with admin privileges)

Tieni presente che questo metodo presuppone che le autorizzazioni di sicurezza predefinite non siano state modificate nella cartella WDI (cosa improbabile nella maggior parte delle situazioni, ma vedi l'avvertenza n. 2 di seguito). Anche in questo caso, è semplicemente una questione di modificare il codice per verificare la presenza di un diverso file / cartella comune che richiede l'accesso come amministratore (System32 \ config \ SAM potrebbe essere un buon candidato alternativo), oppure potresti persino crearne uno tuo appositamente per quello scopo.

Tuttavia, ci sono due avvertenze su questo metodo:

  1. La disabilitazione dell'UAC probabilmente interromperà il semplice fatto che tutto verrebbe comunque eseguito come amministratore.

  2. Tentare di aprire la cartella WDI in Esplora risorse e quindi fare clic su "Continua" quando richiesto aggiungerà diritti di accesso permanenti per quell'account utente, interrompendo così il mio metodo. Se ciò accade, può essere risolto rimuovendo l'account utente dalle autorizzazioni di sicurezza della cartella WDI. Se per qualsiasi motivo l'utente DEVE essere in grado di accedere alla cartella WDI con Windows Explorer, allora dovresti modificare il codice per controllare una cartella diversa (come menzionato sopra, crearne una tua appositamente per questo scopo può essere una buona scelta) .

Quindi, devo ammettere che il mio metodo non è perfetto poiché può essere rotto, ma è un metodo relativamente veloce che è facile da implementare, è ugualmente compatibile con tutte le versioni di Windows 7, 8 e 10, e purché rimanga consapevole delle avvertenze menzionate ha è stato efficace al 100% per me.


0

Funziona per Win7 Enterprise e Win10 Enterprise

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.