我正在尝试枚举在我的机器上运行的所有进程:
public int EnumProcesses()
{
Process[] ProList = Process.GetProcesses();
Proc.iProcessNum = ProList.Length;
for (int i = 0; i < ProList.Length; i++)
{
PrintProcess(ProList[i]);
}
return 0;
}
Process.GetProcesses()
找不到某些进程(例如使用XTrap运行的游戏)。但是,任务管理器可以看到它们。我怎样才能找到这些“隐藏”的过程?
现在我已经选择了它的processID,但是processName是“鬼”(真正的名字是ge.exe,但我得到chrome.exe或其他任何东西)。我试过
GetModuleFileName()
GetModuleHandle()
GetModuleHandleEx()
为什么任务管理器和ProcessExplorer显示为true,Any给我一个解决方案。
答案 0 :(得分:2)
您的程序很可能没有足够的权限来获取有关其他进程的信息。
只有通过执行SYSTEM才能获得每个进程名称,但对于其他进程名称,您可以请求运行具有管理权限(通常通过在应用程序清单中指定UAC级别),(您可能还需要启用SeDebugPrivilege)在进程访问令牌中)这应该允许你看到它们中的大部分。
除此之外,调用本机API会使事情变得更清晰,因为已经有大量示例代码用于执行这些确切的任务。
EDIT ::
GetModuleFileName仅用于进程模块(即DLL),即使这样,它们也必须由当前进程加载。你所追求的是:
GetProcessImageFileName
只要您可以使用所需的访问权限打开流程句柄,它就可以正常工作。这是GetProcessImageFileName的msdn文档的链接:http://msdn.microsoft.com/en-us/library/windows/desktop/ms683217%28v=vs.85%29.aspx
请注意,ProcessExplorer会加载一个驱动程序,从而可以完全访问系统,因此它可以找到几乎所有内容。 TaskManager使用一些臭名昭着的API来检索数据。虽然他们有点太多进入这里。