Muchas, muchas respuestas a esta y muchas otras preguntas en SE ( 1 , 2 , 3 , por nombrar algunas), todas las cuales son deficientes de esta forma u otra, han demostrado claramente que Windows no proporciona una utilidad incorporada confiable . Entonces, es hora de lanzar el tuyo.
Sin más trucos sucios:
Compile el siguiente programa (siga las instrucciones) u obtenga una copia precompilada . Esto solo debe hacerse una vez, luego puede copiarlo en .exe
todas partes (por ejemplo, junto con Sysinternals Suite ).
El código funciona en Win2k + 1 , con y sin UAC, dominio, grupos transitivos, lo que sea, porque se usa de la misma manera que el sistema en sí mismo cuando verifica los permisos. chkadmin
imprime "Admin" o "No admin" y establece el código de salida en 0 o 1, respectivamente. La salida se puede suprimir con el /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, ejecute en el símbolo del sistema del SDK de Windows:
cl /Ox chkadmin.c
(si usa VS2012 +, se necesitan más ajustes si necesita apuntar a 2k / XP )
El método es cortesía de /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908
1 MSDN afirma que las API son XP + pero esto es falso. CheckTokenMembership
es 2k + y el otro es aún más antiguo .