Muitas, muitas respostas para essa e várias outras perguntas no SE ( 1 , 2 , 3 , para citar algumas), todas deficientes dessa maneira ou de outra, mostraram claramente que o Windows não fornece um utilitário interno confiável . Então, é hora de lançar o seu próprio.
Sem mais hacks sujos:
Compile o programa a seguir (instruções a seguir) ou obtenha uma cópia pré-compilada . Isso precisa ser feito apenas uma vez, para que você possa copiar .exe
todos os lugares (por exemplo, ao lado do Sysinternals Suite ).
O código funciona no Win2k + 1 , com e sem UAC, domínio, grupos transitivos, seja o que for - porque usa da mesma maneira que o próprio sistema ao verificar as permissões. chkadmin
imprime "Admin" ou "Non-admin" e define o código de saída como 0 ou 1, respectivamente. A saída pode ser suprimida com o /q
interruptor.
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;
}
Para compilar, execute no prompt de comando do Windows SDK:
cl /Ox chkadmin.c
(se você estiver usando o VS2012 +, serão necessários mais ajustes se precisar segmentar 2k / XP )
O método é cortesia de /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908
1 O MSDN afirma que as APIs são XP +, mas isso é falso. CheckTokenMembership
é 2k + e o outro é ainda mais antigo .