1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
#include <windows.h>
#include <stdio.h>
BOOL IsUserAdmin()
{
HANDLE hToken;
DWORD dwGroups;
PTOKEN_GROUPS pGroups;
SID_IDENTIFIER_AUTHORITY NtAuthority = { SECURITY_NT_AUTHORITY };
PSID pAdministrators;
UINT i = 0;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken) == 0) {
return FALSE;
}
GetTokenInformation(hToken, TokenGroups, NULL, 0, &dwGroups);
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
CloseHandle(hToken);
return FALSE;
}
pGroups = LocalAlloc(LMEM_FIXED, dwGroups);
if (pGroups == NULL) {
CloseHandle(hToken);
return FALSE;
}
if (GetTokenInformation(hToken, TokenGroups, pGroups, dwGroups, &dwGroups) == 0) {
CloseHandle(hToken);
LocalFree(pGroups);
return FALSE;
}
if (AllocateAndInitializeSid(&NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdministrators) == 0) {
CloseHandle(hToken);
LocalFree(pGroups);
return FALSE;
}
if (IsValidSid(pAdministrators) == 0) {
CloseHandle(hToken);
LocalFree(pGroups);
FreeSid(pAdministrators);
return FALSE;
}
while (i < pGroups->GroupCount) {
if (IsValidSid(pGroups->Groups[i].Sid) != 0 && EqualSid(pGroups->Groups[i].Sid, pAdministrators) != 0) {
CloseHandle(hToken);
LocalFree(pGroups);
FreeSid(pAdministrators);
return TRUE;
}
++i;
}
CloseHandle(hToken);
LocalFree(pGroups);
FreeSid(pAdministrators);
return FALSE;
}
int main(void)
{
printf("admin : %s\n", (IsUserAdmin() == FALSE) ? "yes" : "no");
system("PAUSE");
return 0;
} |
Partager