Controlla se il prompt dei comandi corrente è stato avviato come amministratore


21

Sto cercando di scrivere uno script che accetta l'input dell'utente, quindi apporta modifiche a livello di sistema. Ho bisogno che questo sia molto generico, ma semplicemente, in alto, ne ho bisogno per verificare se viene eseguito come "Amministratore". Se non lo è, allora voglio visualizzare un messaggio per dirglielo; se lo è, voglio che continui. C'è un modo costante per verificarlo? Non sto cercando di iniziare una nuova sessione come amministratore, voglio solo rilevare se è attualmente in esecuzione come amministratore



@ g-man come è correlato?
Canadian Luke REINSTATE MONICA

Richiede anche comandi che si comporteranno in modo diverso se eseguiti come amministratore o meno - o almeno li ha ottenuti come risposte.
G-Man dice "Ripristina Monica" l'

Risposte:


16

Trovato su Stack Overflow :

@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

Qual è stato il motivo per cui è stato eliminato?
Canadian Luke REINSTATE MONICA

Funziona, sia dall'account amministratore, sia quando corro come utente limitato, ma scegli "Esegui come amministratore"
Luke canadese REINSTATE MONICA

2
Stessa idea, ma utilizzando gli operatori esecuzione condizionale: net session >nul 2>&1 && echo Success || echo Failure. Trovo questa sintassi compatta più conveniente.
dbenham,

6
Ciò richiede che il servizio "Server" sia in esecuzione.
Ivan_pozdeev,

8

Questo verifica un livello di integrità elevato. (funziona per Windows Vista e versioni successive)

@echo off

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

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)

1
whoami non è supportato in xp my awnser è meglio supporta tutti i sistemi operativi da windows xp a windows 8
Alex

2
Funziona se apro il prompt dei comandi. Se eseguo il CMD come amministratore, mostra comunque che è eseguito come utente
Canadian Luke REINSTATE MONICA

2
Il supporto di @Alex per più SO è eccezionale, ma questo metodo è più affidabile in quanto richiede direttamente le autorizzazioni concesse alla sessione corrente invece di prendere l'assenza di un negativo meno affidabile per inferire un positivo.
Iszi,

2
settimana, whoami / gruppi ha un caso limite in cui si ottengono informazioni errate. Vedere stackoverflow.com/questions/4051883/...
zumalifeguard

1
@ whoamiXP manca su XP.
Ivan_pozdeev,

4

Molte, molte risposte a questa e molte altre domande su SE ( 1 , 2 , 3 per citarne alcune), tutte carenti in questo modo o in un altro, hanno chiaramente dimostrato che Windows non fornisce un'utilità integrata affidabile . Quindi, è tempo di distribuire il tuo.

Senza ulteriori hack sporchi:

Compilare il seguente programma (le istruzioni seguono) o ottenere una copia precompilata . Questo deve essere fatto solo una volta, quindi puoi copiarlo .exeovunque (ad es. Accanto alla Suite Sysinternals ).

Il codice funziona in Win2k + 1 , sia con che senza UAC, dominio, gruppi transitivi, qualunque cosa - perché usa lo stesso modo del sistema stesso quando controlla le autorizzazioni. chkadminstampa "Admin" o "Non admin" e imposta il codice di uscita su 0 o 1, rispettivamente. L'uscita può essere soppressa con l' /qinterruttore.

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;
}

Per compilare, esegui nel prompt dei comandi di Windows SDK:

cl /Ox chkadmin.c

(se si utilizza VS2012 +, sono necessarie ulteriori regolazioni se è necessario targetizzare 2k / XP )


Il metodo è fornito da /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908

1 MSDN afferma che le API sono XP + ma questo è falso. CheckTokenMembership è 2k + e l'altro è ancora più vecchio .


3

Il modo più pulito per verificare i privilegi di amministratore utilizzando uno script CMD, che ho trovato, è qualcosa del genere:

@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

Questo metodo utilizza solo i builtin CMD.exe, quindi dovrebbe essere molto veloce. Verifica inoltre le effettive capacità del processo anziché verificare la presenza di SID o appartenenze a gruppi, quindi viene verificata l' autorizzazione effettiva . E questo funziona fino a Windows 2003 e XP. I normali processi utente o processi non pertinenti non riescono a sondare la directory, dove hanno successo come Admin o processi elevati.

Questo test ha esito negativo se al gruppo Everyone, BUILTIN\Userso ad altri gruppi simili viene concessa l'autorizzazione di lettura per systemprofile. Certo, si tratta di una configurazione non standard diversa da quella su macchine configurate come controller di dominio Windows che conferiscono diritti di lettura / esecuzione a 'AUTORITÀ NT \ Utenti autenticati' al profilo di sistema.


> verifica che VERIFY sia disattivato. > verifica /? Indica a cmd.exe se verificare che i file siano scritti correttamente su un disco. VERIFICA [ON | OFF] Digitare VERIFY senza un parametro per visualizzare l'impostazione VERIFY corrente. In che modo questo comando aiuta lo script?
Canadian Luke REINSTATE MONICA

3
@Canadian Luke, alcuni comandi integrati non cancellano il livello di errore se non si verificano errori. Pertanto, le persone hanno preso l'abitudine di eliminare il livello di errore usando hack come verify. Tendo a usare cd .(cd space dot) che imposta il livello di errore su 0, non produce output ed è anche utile per creare un file di lunghezza zero tramite cd . >somefile. Detto questo, ho testato "dir" su Windows 2000, XP, Vista, 2003, 2008, 2012, 7, 8 e 10. Per tutte quelle "dir", il livello di errore verrà cancellato a 0 in caso di successo se fosse stato impostato prima del 'dir'. Quindi non sono sicuro del perché William abbia usato 'verifica' per cancellare prima il livello di errore.
user3347790
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.