Wiele, wiele odpowiedzi na to i wiele innych pytań w SE ( 1 , 2 , 3, żeby wymienić tylko kilka), z których wszystkie są w ten czy inny sposób wadliwe, wyraźnie pokazały, że Windows nie zapewnia niezawodnego wbudowanego narzędzia . Czas więc wprowadzić własną wersję.
Bez dalszych brudnych hacków:
Skompiluj następujący program (instrukcje poniżej) lub uzyskaj wstępnie skompilowaną kopię . Tę czynność należy wykonać tylko raz, a następnie można skopiować .exe
wszystko (np. Wraz z pakietem Sysinternals ).
Kod działa w Win2k + 1 , zarówno z UAC, jak i bez UAC, domeny, grup przechodnich, cokolwiek - ponieważ używa tego samego sposobu co sam system podczas sprawdzania uprawnień. chkadmin
wypisuje „Admin” lub „Non-admin” i ustawia kod wyjścia odpowiednio na 0 lub 1. Wyjście można stłumić /q
przełącznikiem.
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;
}
Aby skompilować, uruchom w wierszu polecenia zestawu Windows SDK:
cl /Ox chkadmin.c
(w przypadku korzystania z VS2012 + potrzebne są dodatkowe korekty, jeśli trzeba kierować reklamy na 2k / XP )
Metoda została udostępniona dzięki https://stackoverflow.com/questions/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908
1 MSDN twierdzi, że interfejsy API to XP +, ale to nieprawda. CheckTokenMembership
wynosi 2k +, a drugi jest jeszcze starszy .