De nombreuses réponses à cette question et à plusieurs autres questions dans SE ( 1 , 2 , 3 pour n'en nommer que quelques-unes), qui sont toutes déficientes de cette manière ou d'une autre, ont clairement montré que Windows ne fournit pas un utilitaire intégré fiable. . Il est donc temps de déployer le vôtre.
Sans autres hacks sales:
Compilez le programme suivant (les instructions suivent) ou obtenez une copie précompilée . Cela ne doit être fait qu'une seule fois, puis vous pouvez copier le .exe
partout (par exemple aux côtés de la suite Sysinternals ).
Le code fonctionne dans Win2k + 1 , avec et sans UAC, domaine, groupes transitifs, peu importe - car il utilise la même manière que le système lui-même lorsqu'il vérifie les autorisations. chkadmin
imprime "Admin" ou "Non-admin" et définit le code de sortie sur 0 ou 1, respectivement. La sortie peut être supprimée avec le /q
commutateur.
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;
}
Pour compiler, exécutez dans l'invite de commande du SDK Windows:
cl /Ox chkadmin.c
(si vous utilisez VS2012 +, d' autres ajustements sont nécessaires si vous devez cibler 2k / XP )
La méthode est une gracieuseté de /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908
1 MSDN prétend que les API sont XP + mais c'est faux. CheckTokenMembership
est 2k + et l'autre est encore plus ancien .