หลายคำตอบมากมายสำหรับคำถามนี้และคำถามอื่น ๆ ใน 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 +และอีกคนหนึ่งคือแม้เก่า