Banyak, banyak jawaban untuk ini dan beberapa pertanyaan lain di seluruh SE ( 1 , 2 , 3 untuk beberapa nama), yang semuanya kekurangan dalam cara ini atau yang lain, telah dengan jelas menunjukkan bahwa Windows tidak menyediakan utilitas bawaan yang andal . Jadi, sekarang saatnya untuk meluncurkan milik Anda sendiri.
Tanpa peretasan kotor lebih lanjut:
Kompilasi program berikut (ikuti petunjuk), atau dapatkan salinan yang telah dikompilasi . Ini hanya perlu dilakukan sekali, maka Anda dapat menyalin di .exe
mana - mana (misalnya di samping Sysinternals Suite ).
Kode bekerja di Win2k + 1 , baik dengan dan tanpa UAC, domain, kelompok transitif, apa pun - karena menggunakan cara yang sama seperti sistem itu sendiri ketika itu memeriksa perizinan. chkadmin
mencetak "Admin" atau "Non-admin" dan menetapkan kode keluar masing-masing ke 0 atau 1. Outputnya bisa ditekan dengan /q
switch.
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;
}
Untuk mengkompilasi, jalankan di command prompt Windows SDK:
cl /Ox chkadmin.c
(jika menggunakan VS2012 +, lebih banyak penyesuaian diperlukan jika Anda perlu menargetkan 2k / XP )
Metode ini milik /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908
1 MSDN mengklaim API adalah XP + tetapi ini salah. CheckTokenMembership
2k + dan yang lainnya bahkan lebih tua .