通过镜像名称获取某个进程的进程句柄

Posted

技术标签:

【中文标题】通过镜像名称获取某个进程的进程句柄【英文标题】:Get the process handle of a process by image name 【发布时间】:2010-02-17 13:58:15 【问题描述】:

我需要从 C 语言中使用 Win32 的最简单方法,通过其可执行文件名获取另一个进程的进程句柄。

我正在寻找的进程没有任何已注册的窗口类。我也知道,如果它正在运行,那么它只会运行一个实例。

【问题讨论】:

可以看***.com/questions/865152/… 【参考方案1】:

使用CreateToolhelp32Snapshot、Process32First 和Process32Next 枚举所有进程。

在PROCESSENTRY32 内,您可以找到szExeFile 成员。 您可以通过在同一结构中使用进程 ID th32ProcessID 调用 OpenProcess 来获取进程句柄。

一旦找到与您的 exe 名称匹配的进程,您就可以跳出循环并获取句柄。

注意:如果您需要枚举每个进程,无论会话是什么,您都应该获得 SE_DEBUG 权限。

在你的主要调用的顶部:

acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege

这里是acquirePrivilegeByName的定义:

BOOL acquirePrivilegeByName(
                            const TCHAR     *szPrivilegeName)

    HANDLE          htoken;
    TOKEN_PRIVILEGES    tkp;
    DWORD           dwerr;

    if (szPrivilegeName == NULL)
    
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    

    if (!LookupPrivilegeValue(NULL, szPrivilegeName, &(tkp.Privileges[0].Luid)))
        return FALSE;

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken))
        return FALSE;

    if (!AdjustTokenPrivileges(htoken, FALSE, &tkp, 0, NULL, NULL) ||
        GetLastError() != ERROR_SUCCESS)    // may equal ERROR_NOT_ALL_ASSIGNED
    
        dwerr = GetLastError();
        CloseHandle(htoken);
        SetLastError(dwerr);
        return FALSE;
    

    CloseHandle(htoken);
    SetLastError(ERROR_SUCCESS);

    return TRUE;
 //acquirePrivilegeByName()

除了我上面说的,还有一个例子说明如何使用上面的Win32 APIhere。

【讨论】:

以上是关于通过镜像名称获取某个进程的进程句柄的主要内容,如果未能解决你的问题,请参考以下文章

标准用户(XP/Server 2003及以下)如何获取所有运行进程的镜像路径?

delphi 知道路径和进程如何获取窗口句柄?

c# 设置窗体句柄

如何在 C++ 中按名称获取进程句柄?

C++ 获取进程句柄问题

如何在C ++中通过其名称获取进程句柄?