您的位置:首页 > 其它

VC如何判断当前进程处在Administrator权限下

2009-10-02 12:53 477 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: