获取进程路径时访问被拒绝

我试图通过pid获取进程路径,但我得到Win32Exception(访问ID被拒绝)。

代码如下所示:

string path = Process.GetProcessById(pid).MainModule.FileName 

我已经尝试使用OpenProcess和GetModuleFileNameEx但是OpenProcess返回0.我甚至尝试根据C#启用SeDebugPrivilege – 如何启用SeDebugPrivilege但它没有帮助。

上面的代码适用于大多数进程,但抛出SynTPHelper.exe(Synaptics Pointing Device Helper)的错误。应用程序在与我的代码相同的用户名下运行。 两者,我的应用程序和进程都以64位运行。

是否可以在以管理员身份运行我的应用程序的情况下检索路径?

编辑

即使我没有以管理员身份运行它,任务管理器也可以“打开文件位置”。

最后我设法解决了这个问题。 事实certificate,在Vista及以上版本中有新function可用于获取进程路径和新进程访问(PROCESS_QUERY_LIMITED_INFORMATION):

QueryFullProcessImageName

以下是非升级过程的代码:

  private static string GetExecutablePathAboveVista(UIntPtr dwProcessId) { StringBuilder buffer = new StringBuilder(1024); IntPtr hprocess = OpenProcess(ProcessAccessFlags.PROCESS_QUERY_LIMITED_INFORMATION, false, dwProcessId); if (hprocess != IntPtr.Zero) { try { int size = buffer.Capacity; if (QueryFullProcessImageName(hprocess, 0, buff, out size)) { return buffer.ToString(); } } finally { CloseHandle(hprocess); } } return string.Empty; } 

嗯,删除访问权限的服务肯定不是闻所未闻,因此即使是管理员也无法打开该流程。 服务具有足够的权限,像audiodg.exe这样的DRM组件很容易这样做。 鼠标垫助手不会让我觉得需要这样的保护。 但是,嘿,为什么有人需要弄乱鼠标垫助手呢?