VC++中如何判断当前用户是否具有管理员权限

news/2024/7/8 4:02:35

 代码一:

BOOL   CRSysInfo::IsUserAdminPrivilege(const   CString   &   strUserName,BOOL   &   bAdminPrivilege)  
  {    
  bAdminPrivilege  
=   FALSE;  
   
  PSID pSid  
=   NULL;  
  DWORD cbSid  
=   0;  
  LPTSTR bufDomain  
=   NULL;  
  DWORD cbDomain  
=   0;  
  SID_NAME_USE type;  
  LookupAccountName(NULL,strUserName,pSid,
&cbSid,bufDomain,&cbDomain,&type);  
 
if(cbSid)  
  {  
  pSid  
=   new   byte[cbSid];  
  bufDomain  
=   new   TCHAR[cbDomain];  
 
if(LookupAccountName(NULL,strUserName,pSid,&cbSid,bufDomain,&cbDomain,&type))  
  {  
  PSID_IDENTIFIER_AUTHORITY   pAutho  
=   GetSidIdentifierAuthority(pSid);  
  DWORD   dwErr  
=   GetLastError();  
 
if(!dwErr)  
  {  
  SID_IDENTIFIER_AUTHORITY   AdminAuth  
=   SECURITY_NT_AUTHORITY;  
  bAdminPrivilege  
=   !memcmp(pAutho,&AdminAuth,sizeof(SID_IDENTIFIER_AUTHORITY));  
  }  
  }  
  delete []pSid;  
  delete []bufDomain;  
  }  
 
if(bAdminPrivilege)  
 
return TRUE;  
   
  DWORD   rc;  
  USER_INFO_1  
*info;  
          rc  
=   NetUserGetInfo(NULL,_bstr_t(strUserName),1,(byte**)&info);  
 
if(rc   ==   NERR_Success)  
  {  
  bAdminPrivilege  
=   info->usri1_priv   ==   USER_PRIV_ADMIN;  
  NetApiBufferFree(info);  
  }  
   
 
return rc   ==   NERR_Success;  
  }

代码二:

BOOL ExIsAdmin()
{
#define ACCESS_READ 1
    #define ACCESS_WRITE 2

if(g_bIsNT==FALSE)
return TRUE;
HANDLE hToken;
DWORD dwStatus;
DWORD dwAccessMask;
DWORD dwAccessDesired;
DWORD dwACLSize;
DWORD dwStructureSize = sizeof(PRIVILEGE_SET);
PACL pACL = NULL;
PSID psidAdmin = NULL;
BOOL bReturn = FALSE;
PRIVILEGE_SET ps;
GENERIC_MAPPING GenericMapping;
PSECURITY_DESCRIPTOR psdAdmin = NULL;
SID_IDENTIFIER_AUTHORITY SystemSidAuthority = SECURITY_NT_AUTHORITY;

if(!ImpersonateSelf(SecurityImpersonation))
goto LeaveIsAdmin;

if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, FALSE, &hToken))
{
if (GetLastError() != ERROR_NO_TOKEN)
goto LeaveIsAdmin;

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
goto LeaveIsAdmin;

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
goto LeaveIsAdmin;
}

if (!AllocateAndInitializeSid(&SystemSidAuthority, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0, &psidAdmin))
goto LeaveIsAdmin;

psdAdmin = LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
if (psdAdmin == NULL)
goto LeaveIsAdmin;

if (!InitializeSecurityDescriptor(psdAdmin,
SECURITY_DESCRIPTOR_REVISION))
goto LeaveIsAdmin;

dwACLSize = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) +
GetLengthSid(psidAdmin) - sizeof(DWORD);

pACL = (PACL)LocalAlloc(LPTR, dwACLSize);
if (pACL == NULL)
goto LeaveIsAdmin;

if (!InitializeAcl(pACL, dwACLSize, ACL_REVISION2))
goto LeaveIsAdmin;

dwAccessMask= ACCESS_READ | ACCESS_WRITE;

if (!AddAccessAllowedAce(pACL, ACL_REVISION2, dwAccessMask, psidAdmin))
goto LeaveIsAdmin;

if (!SetSecurityDescriptorDacl(psdAdmin, TRUE, pACL, FALSE))
goto LeaveIsAdmin;

if(!SetSecurityDescriptorGroup(psdAdmin, psidAdmin, FALSE))
goto LeaveIsAdmin;
if(!SetSecurityDescriptorOwner(psdAdmin, psidAdmin, FALSE))
goto LeaveIsAdmin;

if (!IsValidSecurityDescriptor(psdAdmin))
goto LeaveIsAdmin;

dwAccessDesired = ACCESS_READ;

GenericMapping.GenericRead = ACCESS_READ;
GenericMapping.GenericWrite = ACCESS_WRITE;
GenericMapping.GenericExecute = 0;
GenericMapping.GenericAll = ACCESS_READ | ACCESS_WRITE;

if (!AccessCheck(psdAdmin, hToken, dwAccessDesired,
&GenericMapping, &ps, &dwStructureSize, &dwStatus, &bReturn))
goto LeaveIsAdmin;

if(!RevertToSelf())
bReturn = FALSE;

LeaveIsAdmin:

if (pACL) LocalFree(pACL);
if (psdAdmin) LocalFree(psdAdmin);
if (psidAdmin) FreeSid(psidAdmin);

return bReturn;

}

均未测试,暂时收藏,需要则取之。


http://www.niftyadmin.cn/n/3102301.html

相关文章

linux下载html并查看代码 curl使用

linux下载html并查看代码 curl使用 linux下载html并查看代码 curl -L http://www.baidu.com posted on 2019-07-15 02:21 ysbl 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/ysbl/p/11186687.html

基于Python实现的论坛帖子情感分析

一、课程项目 Scuinfo文本分类分析 二、项目类容 爬取川大匿名社区SCUinfo在一段时间内的帖子,对其进行情感分类分析,包括情绪分类(积极,消极),帖子内容关联分析等。 三、个人工作完成报告 3.1 工作概…

MAC地址格式

随机配置一个mac地址,发现有的会报出Cannot assign requested address。 错误码是EADDRNOTAVAIL。 检查不是组播地址也不是全0地址。 组播地址就是第一个字节最低位为1,问题就是在这里。 发现第一个字节最低位为1时该函数就会返回0,driver中的…

分别基于WIN32 API界面编程和Cocos2d-x实现的两个版本FlappyBird游戏

1 开发背景 游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《Flappy Bird 》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。…

基于WIN32 API界面编程实现的贪吃蛇游戏

1 设计目的和任务 本次期末大作业采用课程设计的形式进行,作为《Windows编程》课程的期末考核。要求综合运用Windows编程的相关知识,完成大作业的相关内容,并撰写设计报告。其目的和任务是: 巩固和加深学生对本课 程基本知识的理…

定制调试诊断工具和实用程序

定制调试诊断工具和实用程序——摆脱DLL"地狱"(DLL Hell)的困扰(一)原著:Christophe Nasarre编译:NorthTibet 下载源代码:Debugsrc0206.exe (583KB)原文出处:Windows XP&a…

产品经理需要的技能,我有吗?

经常被问产品经理需要哪些技能?或许能说出二三,但是更多时候我在思忖,我是否有这些技能? 一.逻辑能力 产品经理需要把用户所有的操作情况都考虑到,尽可能多的考虑使用场景,这需要严谨的逻辑分析能力。而我作…