如何从进程ID获取进程句柄?

25

我有进程ID,想要获取它的进程句柄。

是否有可用的API进行操作?

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

我在Vista上尝试了这个方法。

我猜我需要在使用OpenProcess之前启用SeDebugPrivilege。

但是要启用SeDebugPrivilege,我需要获取其进程句柄。


你能描述一下为什么你需要这个吗? - dirkgently
我已经为你添加了调试权限代码。 - bdd
5个回答

28
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);
您需要验证您正在使用有效的进程ID,并且您被允许从该进程请求所需的访问权限。

13
不要请求 PROCESS_ALL_ACCESS 权限,因为在安全安装上很难获得。只请求你所需要的权限。 - Hans Passant
6
好的,请尝试请求“同步”权限,这几乎不会失败。然后逐步提升所请求的权限。 - Ben Voigt
1
@Matt Joiner:我该如何在使用DDK的KMDF中实现这一功能? - AminM

15
这是您在寻找的内容吗?
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
CloseHandle(processHandle); 

另外,这是我用来在注入动态链接库(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上成功使用上述代码。

这将返回窗口句柄,而不是进程句柄。我正在寻找从进程ID获取进程句柄。 - anand

1

您需要提升权限。同时请查看类似问题这里


1
我刚遇到了与描述相同的问题:OpenProcess() == NULL且GetLastError() == 0。 结果发现是公共语言运行时支持设置,被设置为“纯净”的应该只是“常规”。花了我很长时间才找到。
对于VS2010 c++,转到->项目属性->配置属性->C/C++->常规。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接