Багато, багато відповідей на це та безліч інших запитань у SE ( 1 , 2 , 3, щоб назвати декілька), які мають той чи інший недолік, чітко показали, що Windows не забезпечує надійну вбудовану утиліту . Отже, саме час розгорнути своє.
Без зайвих брудних злому:
Складіть наступну програму (інструкції слідують) або отримайте попередньо складену копію . Це потрібно зробити лише один раз, тоді ви можете скопіювати .exe
всюди (наприклад, поруч із набором Sysinternals ).
Код працює в Win2k + 1 , як з UAC, так і без UAC, доменних, перехідних груп, як би там не було - тому що він використовує той самий спосіб, що і сама система під час перевірки дозволів. chkadmin
друкує "Адміністратор" або "Не адміністратор" і встановлює вихідний код відповідно 0 або 1. Вихід можна придушити за допомогою /q
перемикача.
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;
}
Для компіляції запустіть у командному рядку Windows SDK команду:
cl /Ox chkadmin.c
(якщо використовується VS2012 +, потрібні додаткові коригування, якщо вам потрібно націлити 2k / XP )
Метод наданий /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908
1 MSDN стверджує, що API - це XP +, але це неправда. CheckTokenMembership
2k +, а інший ще старший .