#include
<
windows.h
>
#include
<
stdio.h
>
BOOL IsAdmin(
void
);
int
main(
int
argc,
char
*
argv[])
{
if
(IsAdmin())
printf(
"
IsAdmin - TRUE
"
);
else
printf(
"
IsAdmin - FALSE
"
);
return
0;
}
BOOL IsAdmin(
void
)
{
HANDLE hAccessToken;
BYTE
*
InfoBuffer;
PTOKEN_GROUPS ptgGroups;
DWORD dwInfoBufferSize;
PSID psidAdministrators;
SID_IDENTIFIER_AUTHORITY siaNtAuthority
=
SECURITY_NT_AUTHORITY;
UINT i;
BOOL bRet
=
FALSE;
if
(
!
OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,
&
hAccessToken))
goto
cleanup;
InfoBuffer
=
new
BYTE[
1024
];
if
(
!
InfoBuffer)
goto
cleanup;
bRet
=
GetTokenInformation(hAccessToken,
TokenGroups,
InfoBuffer,
1024
,
&
dwInfoBufferSize);
CloseHandle( hAccessToken );
if
(
!
bRet)
goto
cleanup;
if
(
!
AllocateAndInitializeSid(
&
siaNtAuthority,
2
,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0
,
0
,
0
,
0
,
0
,
0
,
&
psidAdministrators))
goto
cleanup;
bRet
=
FALSE;
ptgGroups
=
(PTOKEN_GROUPS)InfoBuffer;
for
(i
=
0
;i
<
ptgGroups
->
GroupCount;i
++
)
{
if
(EqualSid(psidAdministrators,ptgGroups
->
Groups[i].Sid))
{
bRet
=
TRUE;
break
;
}
}
FreeSid(psidAdministrators);
cleanup:
if
(InfoBuffer)
delete InfoBuffer;
return
bRet;
}