Rất nhiều câu trả lời cho câu hỏi này và nhiều câu hỏi khác trên SE ( 1 , 2 , 3 để đặt tên cho một số ít), tất cả đều thiếu theo cách này hay cách khác, đã cho thấy rõ rằng Windows không cung cấp tiện ích tích hợp đáng tin cậy . Vì vậy, đã đến lúc bạn tự tung ra.
Không có thêm bất kỳ hack bẩn:
Biên dịch chương trình sau (hướng dẫn theo) hoặc lấy bản sao được biên dịch trước . Điều này chỉ cần được thực hiện một lần, sau đó bạn có thể sao chép .exe
mọi nơi (ví dụ: cùng với Sysiternals Suite ).
Mã này hoạt động trong Win2k + 1 , cả có và không có UAC, tên miền, nhóm chuyển tiếp, bất cứ điều gì - bởi vì nó sử dụng cùng một cách với chính hệ thống khi kiểm tra quyền. chkadmin
in "Quản trị viên" hoặc "Không phải quản trị viên" và đặt mã thoát thành 0 hoặc 1, tương ứng. Đầu ra có thể bị triệt tiêu bằng công /q
tắc.
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;
}
Để biên dịch, hãy chạy trong dấu nhắc lệnh Windows SDK:
cl /Ox chkadmin.c
(nếu sử dụng VS2012 +, cần điều chỉnh nhiều hơn nếu bạn cần nhắm mục tiêu 2k / XP )
Phương pháp này được cung cấp bởi /programming/4230602/detect-if-program-is-ricky-with-full-ad Administrator-rights / 4230908 # 4230908
1 MSDN tuyên bố các API là XP + nhưng điều này là sai. CheckTokenMembership
là 2k + và một cái khác thậm chí còn cũ hơn .