Многие, многие ответы на этот и многие другие вопросы в SE ( 1 , 2 , 3 и многие другие), каждый из которых так или иначе несовершенен, ясно показали, что Windows не предоставляет надежную встроенную утилиту , Итак, пришло время выкатить свои собственные.
Без дальнейших грязных хаков:
Скомпилируйте следующую программу (следуйте инструкциям) или получите предварительно скомпилированную копию . Это нужно сделать только один раз, затем вы можете скопировать его .exe
везде (например, рядом с Sysinternals Suite ).
Код работает в Win2k + 1 , как с UAC, так и с доменом, транзитивными группами и без них, независимо от того, что он использует - потому что он использует тот же способ, что и сама система при проверке разрешений. chkadmin
выводит «Admin» или «Non-admin» и устанавливает код выхода равным 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 +, а другой еще старше .