通过镜像名称获取某个进程的进程句柄
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。
【讨论】:
以上是关于通过镜像名称获取某个进程的进程句柄的主要内容,如果未能解决你的问题,请参考以下文章