程序如何知道当前用哪个用户来运行?程序可能被桌面用户启动,也可能被IIS的访客用户启动,也可能被SYSTEM来
启动。如何知道当前被哪个用户启动呢?或者说正在以哪个身份来运行?

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc/?id=1241//获取进程的用户名  
      BOOL   CSecurityTool::GetProcessUser(DWORD   dwProcessID,   TCHAR   *szUserName,   DWORD   nNameLen)  
      {  
      BOOL   fResult     =   FALSE;  
              HANDLE   hProc     =   NULL;  
      HANDLE   hToken   =   NULL;  
      TOKEN_USER   *pTokenUser   =   NULL;  
       
      __try  
      {  
                      //   Open   the   process   with   PROCESS_QUERY_INFORMATION   access  
                      hProc   =   OpenProcess(PROCESS_QUERY_INFORMATION,   FALSE,   dwProcessID);  
                      if   (hProc   ==   NULL)  
      {  
      __leave;  
      }  
                      fResult   =   OpenProcessToken(hProc,   TOKEN_QUERY,   &hToken);  
                      if(!fResult)      
      {  
      __leave;  
      }  
       
      DWORD   dwNeedLen   =   0;  
      fResult   =   GetTokenInformation(hToken,TokenUser,   NULL,   0,   &dwNeedLen);  
      if   (dwNeedLen   >   0)  
      {  
      pTokenUser   =   (TOKEN_USER*)new   BYTE[dwNeedLen];  
      fResult   =   GetTokenInformation(hToken,  
                                                                  TokenUser,  
                                                                  pTokenUser,  
                                                                  dwNeedLen,  
                                                                  &dwNeedLen);  
      if   (!fResult)  
      {  
      __leave;  
      }  
      }  
      else  
      {  
      __leave;  
      }  
       
      SID_NAME_USE   sn;  
      TCHAR   szDomainName[MAX_PATH];  
      DWORD   dwDmLen   =   MAX_PATH;  
      fResult   =   LookupAccountSid(NULL,  
                                                            pTokenUser->User.Sid,  
                                                            szUserName,  
                                                            &nNameLen,  
                                                                            szDomainName,  
                                                                            &dwDmLen,  
                                                                            &sn);  
      }  
      __finally  
      {  
      if   (hProc)  
      ::CloseHandle(hProc);  
      if   (hToken)  
      ::CloseHandle(hToken);  
      if   (pTokenUser)  
      delete[]   (char*)pTokenUser;  
       
      return   fResult;  
      }  
      }