2010-02-08 86 views
18

我有进程ID,我想获得它的进程句柄。如何从进程ID获取进程句柄?

有没有可用的API。

我试图使用OpenProcess,但它返回NULL,并GetLastError = 0。

这我试图在Vista上。

我想我需要在使用OpenProcess之前启用SeDebugPrivilege。 但为了启用SeDebugPrivilege,我需要获取它的进程句柄。

+0

你能描述你为什么需要这个? – dirkgently 2010-02-08 11:11:49

+0

我已经为ya添加了调试权限代码 – bdd 2010-02-08 12:46:27

回答

22
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId); 

您需要验证您是否使用了有效的进程ID,并且允许您从进程请求的访问权限。

+0

procId有效。 – anand 2010-02-08 11:14:04

+11

不要求PROCESS_ALL_ACCESS,你不太可能在安全的安装中获得。只问你需要什么。 – 2010-02-08 13:38:10

+5

对,试着要求SYNCHRONIZE,它几乎不会失败。然后从那里提高请求的许可。 – 2010-02-08 19:12:17

9

这是你在找什么?

HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId); 
CloseHandle(processHandle); 

此外,这里是一些代码,我用于设置调试privledge在注入DLL之前。

void Loader::EnableDebugPriv(void) 
{ 
    HANDLE    hToken; 
    LUID    SeDebugNameValue; 
    TOKEN_PRIVILEGES TokenPrivileges; 

    if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
    { 
     if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &SeDebugNameValue)) 
     { 
      TokenPrivileges.PrivilegeCount    = 1; 
      TokenPrivileges.Privileges[0].Luid   = SeDebugNameValue; 
      TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

      if(AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) 
      { 
       CloseHandle(hToken); 
      } 
      else 
      { 
       CloseHandle(hToken); 
       throw std::exception("Couldn't adjust token privileges!");    
      } 
     } 
     else 
     { 
      CloseHandle(hToken); 
      throw std::exception("Couldn't look up privilege value!"); 
     } 
    } 
    else 
    { 
     throw std::exception("Couldn't open process token!"); 
    } 
} 

我已经在Windows Vista上成功使用了上述代码。

+0

这将返回窗口句柄,而不是流程句柄 我正在寻找流程ID为 – anand 2010-02-08 11:23:17

+1

的流程句柄正如Matt Joiner所说...参见上文。 – bdd 2010-02-08 11:34:45

1

您需要提升的权限。也看类似的问题here

1

我刚刚遇到了与上述完全相同的问题:OpenProcess()== NULL和GetLastError()== 0. 原来是Common Language RunTime Support设置,被设置为“Pure”应该只是“共同”。花了我很长时间才发现。

对于VS2010 C++转到 - >项目属性 - >配置属性 - > C/C++ - >常规