VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 680|回复: 1

判断是否以管理员身份权限运行的C++代码源码

[复制链接]

4

主题

4

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2023-9-26 13:57:54 | 显示全部楼层 |阅读模式
本篇文章属于《518抽奖软件开发日志》系列文章的一部分。
我在开发《518抽奖软件》(www.518cj.net)的时候,有时候需要判断,进程是否以管理员身份权限运行。网上找了一些代码,很多不能用或不全面,现整理代码如下。
  1. BOOL Tfuns::is_userAdmin()
  2. {
  3.         return is_admin(FALSE);
  4. }
  5. BOOL Tfuns::is_runasAdmin()
  6. {
  7.         return is_admin(TRUE);
  8. }

  9. static BOOL is_admin(BOOL CheckTokenForGroupDeny)
  10. {
  11.         WCHAR  *pGroup = NULL;
  12.         HANDLE  hToken = NULL;
  13.         struct group
  14.         {
  15.                 DWORD auth_id;
  16.                 WCHAR *name;
  17.         };
  18.         struct group groups[] =
  19.         {
  20.                 { DOMAIN_ALIAS_RID_USERS, L"User" },
  21.                 { DOMAIN_ALIAS_RID_GUESTS, L"Guest" },
  22.                 { DOMAIN_ALIAS_RID_POWER_USERS, L"Power" },
  23.                 { DOMAIN_ALIAS_RID_ADMINS, L"Admin" }
  24.         };
  25.         if (GetVersion() & 0x80000000) return TRUE;  //Not NT

  26.         if (OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, FALSE, &hToken) ||
  27.                 OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
  28.         {
  29.                 SID_IDENTIFIER_AUTHORITY SystemSidAuthority = { SECURITY_NT_AUTHORITY };
  30.                 TOKEN_GROUPS* ptg = NULL;
  31.                 BOOL       ValidTokenGroups = FALSE;
  32.                 DWORD      cbTokenGroups;
  33.                 DWORD      i, j;

  34.                 if (CheckTokenForGroupDeny)
  35.                         pCheckTokenMembership = (CHECKTOKENMEMBERSHIP)GetProcAddress(GetModuleHandle(L"ADVAPI32"), "CheckTokenMembership");

  36.                 if (!CheckTokenForGroupDeny || pCheckTokenMembership == NULL)
  37.                 {
  38.                         if (!GetTokenInformation(hToken, TokenGroups, NULL, 0, &cbTokenGroups) &&
  39.                                 GetLastError() == ERROR_INSUFFICIENT_BUFFER)
  40.                         {
  41.                                 if ((ptg = (TOKEN_GROUPS*)GlobalAlloc(GPTR, cbTokenGroups)) &&
  42.                                         GetTokenInformation(hToken, TokenGroups, ptg, cbTokenGroups, &cbTokenGroups))
  43.                                 {
  44.                                         ValidTokenGroups = TRUE;
  45.                                 }
  46.                         }
  47.                 }

  48.                 if (ValidTokenGroups || (CheckTokenForGroupDeny && pCheckTokenMembership))
  49.                 {
  50.                         PSID psid;
  51.                         for (i = 0; i < sizeof(groups) / sizeof(struct group); i++)
  52.                         {
  53.                                 if (AllocateAndInitializeSid(&SystemSidAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID,
  54.                                         groups[i].auth_id, 0, 0, 0, 0, 0, 0, &psid))
  55.                                 {
  56.                                         BOOL IsMember = FALSE;
  57.                                         if (CheckTokenForGroupDeny && pCheckTokenMembership)
  58.                                                 pCheckTokenMembership(0, psid, &IsMember);
  59.                                         else if (ValidTokenGroups)
  60.                                         {
  61.                                                 for (j = 0; j < ptg->GroupCount; j++)
  62.                                                 {
  63.                                                         if (EqualSid(ptg->Groups[j].Sid, psid)) IsMember = TRUE;
  64.                                                 }
  65.                                         }
  66.                                         if (IsMember) pGroup = groups[i].name;
  67.                                         FreeSid(psid);
  68.                                 }
  69.                         }//for groups
  70.                 }
  71.                 if (ptg) GlobalFree(ptg);
  72.                 CloseHandle(hToken);

  73.                 if (pGroup && _wcsicmp(pGroup, L"Admin") == 0) return TRUE;
  74.                 else return FALSE;
  75.         }
  76.         return FALSE;
  77. }
复制代码


回复

使用道具 举报

0

主题

5

帖子

66.00

积分

注册会员

Rank: 2

积分
66.00
发表于 2024-8-14 10:42:18 | 显示全部楼层
6666666666666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表