我在一个服务程序中访问HKEY_CURRENT_USER键下面 Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings,
能够成功实现
RegOpenKeyEx(HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"),
0,
KEY_QUERY_VALUE,
&hKey)
,但是当我查询
RegQueryValueEx(hKey,TEXT("ProxyEnable"),NULL,NULL,(LPBYTE)&ProxyEnable,&dwBufLen);的时候,发现返回的ProxyEnable有问题,我使用的是代理,可读出来的是0值,为什么?我怀疑是权限的问题,因为我访问HKEY_LOCAL_MACHINE主键下面的
Software\\Microsoft\\Windows\\CurrentVersion\\Run能构成功查询,但服务程序是system权限,怎么会存在权限的问题呢?

解决方案 »

  1.   

    我认为不是该值的问题,因为将服务程序改成一般的程序就可以正确的读出这些值来
    只有当程序注册为服务时,不能得到正确的值,ProxyEnable总是返回0,而Proxy
      

  2.   

    刚翻了翻以前的帖子,有和我一样问题的,应该事system权限不能对 HKEY_CURRENT_USER里面的信息进行操作。可以模拟用户登录,再去访问,怎么样实现这个过程,还情高手指教,是否可以先获得administrator的权限再查询注册表呢?
      

  3.   

    //   whoami.cpp   
      //   cl   whoami.cpp   /c1   /c   
      //   link   whoami.obj   /nodefaultlib   msvcrt.lib   advapi32.lib   kernel32.lib   /align:16   
      //   
      //   
      //   
        
        
        
      #pragma   comment(lib,"Advapi32.lib")   
        
      #include   <stdio.h>   
      #include   <stdlib.h>   
      #include   <string.h>   
      #include   <Windows.h>   
        
      #define   UULEN   256   
      int   main(int   argc,char   *argv[])   
      {   
              //OpenProcess();   
              HANDLE   hp   ,   htoken;   
              char   buff[2560];   
              unsigned   long   size   =   2560;   
        
              TOKEN_USER   *tuser;   
      PTOKEN_GROUPS   tgroup;   
      PTOKEN_OWNER   towner;   
      PTOKEN_SOURCE   tsource;   
              PSID   sid;   
              char   user[UULEN],   domain[UULEN];   
              SID_NAME_USE   snu;   
        
              hp   =   htoken   =   INVALID_HANDLE_VALUE;   
              hp   =   GetCurrentProcess();   
        
              if(!OpenProcessToken(hp,   TOKEN_QUERY   |   TOKEN_QUERY_SOURCE   ,   &htoken))   
              {   
                      printf("OpenProcessToken   error   :   %u\r\n",   GetLastError());   
                      goto   exit_main;   
              }   
              if(!GetTokenInformation(htoken,   TokenUser,   (void*)buff,   size,   &size))   
              {   
                      printf("GetTokenInformation   error   :   %u\r\n",   GetLastError());   
                      goto   exit_main;   
              }   
              tuser   =   (TOKEN_USER*)buff;   
              sid   =   tuser->User.Sid;   
              size   =   UULEN;   
              if(!LookupAccountSid(NULL,   sid,   user,   &size,   domain,   &size,   &snu))   
              {   
                      printf("LookupAccountSid   error   :   %u\r\n",   GetLastError());   
                      goto   exit_main;   
              }   
      //         printf("you   are   '%s\\%s'\r\n",   domain,   user);   
      printf(   "Domain     :   %s\nUser         :   %s\n",   domain,   user);   
        
      size   =   UULEN   *10;   
              if(!GetTokenInformation(htoken,   TokenGroups   ,   (void*)buff,   size,   &size))   
              {   
                      printf("GetTokenInformation   error   :   %u\r\n",   GetLastError());   
                      goto   exit_main;   
              }   
              tgroup   =   (PTOKEN_GROUPS)buff;   
              int   len   ;   
      len   =   tgroup->GroupCount;   
      printf(   "Group       :\n");   
      int   i;   
      for(   i   =   0;   i<   len   ;   i++)     
      {   
      sid   =   tgroup->Groups[i].Sid   ;   
      size   =   UULEN;   
      if(!LookupAccountSid(NULL,   sid,   user,   &size,   domain,   &size,   &snu))   
      {   
      // printf("LookupAccountSid   error   :   %u\r\n",   GetLastError());   
      break;   
      }   
      printf("\t[%d]   %s\n",i+1,   user   );   
      }   
        
      size   =   2560;   
        
              if(!GetTokenInformation(htoken, TokenOwner,   (void*)buff,   size,   &size))   
              {   
                      printf("GetTokenInformation   error   :   %u\r\n",   GetLastError());   
                      goto   exit_main;   
              }   
        
      towner   =   (PTOKEN_OWNER)buff;   
              sid   =   towner->Owner;   
              size   =   UULEN;   
        
              if(!LookupAccountSid(NULL,   sid,   user,   &size,   domain,   &size,   &snu))   
              {   
                      printf("LookupAccountSid   error   :   %u\r\n",   GetLastError());   
                      goto   exit_main;   
              }   
        
      printf(   "Owner       :   %s\n",   user   );   
        
      size   =   2560;   
        
              if(!GetTokenInformation(htoken, TokenSource,   (void*)buff,   size,   &size))   
              {   
                      printf("GetTokenInformation   error   :   %u\r\n",   GetLastError());   
                      goto   exit_main;   
              }   
      tsource   =   (PTOKEN_SOURCE   )   buff;   
              tuser   =   (TOKEN_USER*)buff;   
              sid   =   tuser->User.Sid;   
              size   =   UULEN;   
        
      printf(   "Source     :   %.8s\n",   tsource->SourceName   );   
        
        
      exit_main:   
              if(htoken   !=   INVALID_HANDLE_VALUE)CloseHandle(htoken);   
              if(hp   !=   INVALID_HANDLE_VALUE)CloseHandle(hp);   
              return   0;   
      }