6

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

代码如下所示:

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

我曾尝试将 OpenProcess 与 GetModuleFileNameEx 一起使用,但 OpenProcess 返回 0。我什至尝试根据C# 启用 SeDebugPrivilege – 如何启用 SeDebugPrivilege但没有帮助。

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

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

编辑

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

4

2 回答 2

16

最后我设法解决了它。事实证明,在 Vista 及更高版本中有用于获取进程路径和新进程访问的新功能(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;
    }
于 2010-09-06T20:43:07.623 回答
1

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

于 2010-08-03T19:35:39.993 回答