如何判断用户是否具备管理员权限

转载 2006年06月21日 15:46:00

 如何判断用户是否具备管理员权限

 #include   <windows.h>  
  #include   <stdio.h>  
   
  //    
  //   Make   up   some   private   access   rights.  
  //    
  #define   ACCESS_READ     1  
  #define   ACCESS_WRITE   2  
   
  //**********************************************************************  
  //    
  //   FUNCTION:     IsAdmin   -   This   function   checks   the   token   of   the    
  //                         calling   thread   to   see   if   the   caller   belongs   to  
  //                         the   Administrators   group.  
  //    
  //   PARAMETERS:       none  
  //    
  //   RETURN   VALUE:   TRUE   if   the   caller   is   an   administrator   on   the   local  
  //                         machine.     Otherwise,   FALSE.  
  //    
  //**********************************************************************  
  BOOL   IsAdmin(void)   {  
   
        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;  
         
        __try   {  
   
              //   AccessCheck()   requires   an   impersonation   token.  
              ImpersonateSelf(SecurityImpersonation);  
   
              if   (!OpenThreadToken(GetCurrentThread(),   TOKEN_QUERY,   FALSE,    
                          &hToken))   {  
   
                    if   (GetLastError()   !=   ERROR_NO_TOKEN)  
                          __leave;  
   
                    //   If   the   thread   does   not   have   an   access   token,   we'll    
                    //   examine   the   access   token   associated   with   the   process.  
                    if   (!OpenProcessToken(GetCurrentProcess(),   TOKEN_QUERY,    
                                &hToken))  
                          __leave;  
              }  
   
              if   (!AllocateAndInitializeSid(&SystemSidAuthority,   2,    
                          SECURITY_BUILTIN_DOMAIN_RID,   DOMAIN_ALIAS_RID_ADMINS,  
                          0,   0,   0,   0,   0,   0,   &psidAdmin))  
                    __leave;  
   
              psdAdmin   =   LocalAlloc(LPTR,   SECURITY_DESCRIPTOR_MIN_LENGTH);  
              if   (psdAdmin   ==   NULL)  
                    __leave;  
   
              if   (!InitializeSecurityDescriptor(psdAdmin,  
                          SECURITY_DESCRIPTOR_REVISION))  
                    __leave;  
       
              //   Compute   size   needed   for   the   ACL.  
              dwACLSize   =   sizeof(ACL)   +   sizeof(ACCESS_ALLOWED_ACE)   +  
                          GetLengthSid(psidAdmin)   -   sizeof(DWORD);  
   
              //   Allocate   memory   for   ACL.  
              pACL   =   (PACL)LocalAlloc(LPTR,   dwACLSize);  
              if   (pACL   ==   NULL)  
                    __leave;  
   
              //   Initialize   the   new   ACL.  
              if   (!InitializeAcl(pACL,   dwACLSize,   ACL_REVISION2))  
                    __leave;  
   
              dwAccessMask=   ACCESS_READ   |   ACCESS_WRITE;  
               
              //   Add   the   access-allowed   ACE   to   the   DACL.  
              if   (!AddAccessAllowedAce(pACL,   ACL_REVISION2,  
                          dwAccessMask,   psidAdmin))  
                    __leave;  
   
              //   Set   our   DACL   to   the   SD.  
              if   (!SetSecurityDescriptorDacl(psdAdmin,   TRUE,   pACL,   FALSE))  
                    __leave;  
   
              //   AccessCheck   is   sensitive   about   what   is   in   the   SD;   set  
              //   the   group   and   owner.  
              SetSecurityDescriptorGroup(psdAdmin,   psidAdmin,   FALSE);  
              SetSecurityDescriptorOwner(psdAdmin,   psidAdmin,   FALSE);  
   
              if   (!IsValidSecurityDescriptor(psdAdmin))  
                    __leave;  
   
              dwAccessDesired   =   ACCESS_READ;  
   
              //    
              //   Initialize   GenericMapping   structure   even   though   we  
              //   won't   be   using   generic   rights.  
              //    
              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))   {  
                    printf("AccessCheck()   failed   with   error   %lu/n",   GetLastError());  
                    __leave;  
              }  
   
              RevertToSelf();  
         
        }   __finally   {  
   
              //   Cleanup    
              if   (pACL)   LocalFree(pACL);  
              if   (psdAdmin)   LocalFree(psdAdmin);      
              if   (psidAdmin)   FreeSid(psidAdmin);  
        }  
   
        return   bReturn;  
  }  
   
  void   main()   {  
   
        if   (IsAdmin())  
              printf("You   are   an   administrator/n");  
        else  
              printf("You   are   not   an   administrator/n");  
  }  

如何判断用户是否是一个管理员

如何判断用户是否是一个管理员许多应用程序在允许用户执行某个操作之前,首先要判断这个用户是否是一个管理员,但在执行判断成员关系的过程中可能会出现错误。在Administrators组中判定成员关系的最常...
  • loomman
  • loomman
  • 2009年03月29日 20:32
  • 2559

NT下判断用户是否有管理员权限

NT下判断用户是否有管理员权限 OK,  Thanks to Loaden found out that my original code to determine whether an user ...

C# WinForm判断程序是否以管理员身份运行,UAC权限的提权与降权

如果程序不是以管理员身份运行,操作本地文件会提示:System.UnauthorizedAccessException异常   Vista 和 Windows 7 操作系统为了加强...
  • wlanye
  • wlanye
  • 2013年04月08日 10:55
  • 3188

判断进程是否以管理员权限运行(***)

判断进程是否以管理员权限运行,讨论管理员权限与UAC开启和关闭、登录的用户类型之间的关系...

判断自己是否有管理员权限和自己是否为服务

前言在逆向一个专杀, MFC Dialog的程序. 在CxxWinApp::InitInstance中看到, 在增加权限之前, 先判断自己是否有管理员权限. 这代码M都给了,不用去逆向了,...

子进程 保护地址空间 运行独立的子进程 管理员以标准用户权限运行时

为了增加程序的运行效率 一项复杂的功能往往需要创建一个新的线程或者进程 帮助我们完成复杂的工作 但是在一个进程中创建一个线程 会遇到同步的问题 也就是说当主线程需要得到新创建线程运行的结果的时候 会遇...

mongoDB权限设置之创建管理员和普通用户

mongoDB权限设置之创建管理员和普通用户

绕过Windows 10默认UAC(用户帐户控制)配置|WIN10如何绕过管理员权限密码进入电脑?

本文标签: Windows10 UAC(用户帐户控制)配置 绕过管理员权限 项目地址: https://github.com/hjc4869/UacBypass 自从Vista开始,这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何判断用户是否具备管理员权限
举报原因:
原因补充:

(最多只允许输入30个字)