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

 代码一:

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;

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值