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

转载 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");  
  }  

相关文章推荐

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

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

如何设置权限,使管理员能上网,而受限用户却不能上网?

可以利用尝试用登录、注销脚本进行,以下方法在Microsoft Virtual PC 2004虚拟机里测试通过。 一、适用范围:   对等网,采用NAT方式共享Internet连接,且安装Wi...

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

本文标签: Windows10 UAC(用户帐户控制)配置 绕过管理员权限 项目地址: https://github.com/hjc4869/UacBypass 自从Vista开始,这...

管理员界面的用户权限设置

1.用户账号管理 2.用户权限设置 3.预警参数设置 4.用户意见反馈

创建一个非超级管理员用户,并增加 sudo 权限

1. 添加新用户 ubuntusudo adduser ubuntu系统会提示以下信息:正在添加用户“ubuntu”... 正在添加新组“ubuntu”(1001)... 正在添加新用户“ubuntu...

数据库管理员用户角色组权限设计

用户角色设计,权限设计,角色组,数据库设计,用户角色权限表设计
  • J_H_S
  • J_H_S
  • 2017-03-15 22:47
  • 142

Ubuntu中的用户管理(五)授予常规用户系统管理员权限

<!-- @page {margin:2cm} h4 {margin-bottom:0.21cm} h4.western {font-family:"DejaVu Sans",san...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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