Viele, viele Antworten auf diese und mehrere andere Fragen in SE ( 1 , 2 , 3, um nur einige zu nennen), die alle auf die eine oder andere Weise unzureichend sind, haben deutlich gezeigt, dass Windows kein zuverlässiges integriertes Dienstprogramm bietet . Also ist es Zeit, Ihre eigenen auszurollen.
Ohne weitere schmutzige Hacks:
Kompilieren Sie das folgende Programm (Anweisungen folgen) oder erhalten Sie eine vorkompilierte Kopie . Dies muss nur einmal gemacht werden, dann können Sie das .exe
überall kopieren (zB neben der Sysinternals Suite ).
Der Code funktioniert in Win2k + 1 sowohl mit als auch ohne UAC-, Domänen- und transitiven Gruppen, da er beim Überprüfen von Berechtigungen auf die gleiche Weise wie das System selbst verwendet wird. chkadmin
druckt "Admin" oder "Non-admin" und setzt den Exit-Code auf 0 bzw. 1. Die Ausgabe kann mit dem /q
Schalter unterdrückt werden.
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;
}
Führen Sie zum Kompilieren in der Windows SDK-Eingabeaufforderung Folgendes aus:
cl /Ox chkadmin.c
(Wenn Sie VS2012 + verwenden, sind weitere Anpassungen erforderlich, wenn Sie auf 2k / XP abzielen müssen. )
Die Methode wurde mit freundlicher Genehmigung von /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908 erstellt
1 MSDN behauptet, dass es sich bei den APIs um XP + handelt, dies ist jedoch falsch. CheckTokenMembership
ist 2k + und der andere ist noch älter .