如何获得一个进程的Session,比如我用终端登录启动的程序的session就和在本机启动的Session不一样的。

解决方案 »

  1.   

    The OpenProcessToken function opens the access token associated with a process.BOOL OpenProcessToken(
      HANDLE ProcessHandle,
      DWORD DesiredAccess,
      PHANDLE TokenHandle
    );
      

  2.   

    #include "stdafx.h"
    #include <sstream>
    #include <atlsecurity.h>
    #include <Tlhelp32.h>
    #pragma comment(lib, "Kernel32.lib")int _tmain(int argc, _TCHAR* argv[])
    { HANDLE     hSnap = NULL;
     hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     if (hSnap == INVALID_HANDLE_VALUE)
      return FALSE;
     PROCESSENTRY32 pe32;
     ZeroMemory(&pe32,sizeof(pe32));
     pe32.dwSize = sizeof(pe32);
     std::ostringstream oss;
     if (Process32First(hSnap, &pe32))
     {
      do
      {
       HANDLE hProcess
    =OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,false,pe32.th32Proces
    sID);
       if(hProcess ==NULL)
       {
        oss<<"OpenProcess "<<pe32.th32ProcessID<<" error"<<std::endl;
       }
       else
       {
        CAccessToken token;
        token.GetProcessToken(TOKEN_QUERY,hProcess);
        CSid sid;
        token.GetUser(&sid);
        oss<<"process "<<pe32.th32ProcessID<<" user account ";
        if(sid.IsValid())
         oss<<sid.AccountName();
        oss<<std::endl;
        CloseHandle(hProcess);
       }
       ZeroMemory(&pe32,sizeof(pe32));
       pe32.dwSize = sizeof(pe32);
      }
      while ( Process32Next (hSnap, &pe32));
     }
     CloseHandle (hSnap);
     printf(oss.str().c_str());
     return 0;
    }
    //build environment: VC.NET 2003, Windows XP SP1