BOOL __stdcall IsAdmin() {
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 = (PTOKEN_GROUPS)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;
}