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

时间:2010-08-03 18:55:43

标签: c# winapi process access-denied win32exception

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

代码如下所示:

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

我尝试过将OpenProcess与GetModuleFileNameEx一起使用,但OpenProcess返回0.我甚至尝试根据C# – How to enable SeDebugPrivilege启用SeDebugPrivilege,但它没有帮助。

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

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

修改

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

2 个答案:

答案 0 :(得分:15)

最后我设法解决了这个问题。事实证明,在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;
    }

答案 1 :(得分:1)

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