判断程序是否是以 管理员 身份运行 visual c++

// 判断本程序是否是以管理员身份运行的 

//BY :暗影行者

// date: 20110716

BOOL ExeIsAdmin() 
{ 
#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; 
 
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值