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 .exe
ovunque (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. chkadmin
stampa "Admin" o "Non admin" e imposta il codice di uscita su 0 o 1, rispettivamente. L'uscita può essere soppressa con l' /q
interruttore.
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 .