拒绝访问而得到处理路径拒绝访问而得到处理路径(Access denied while getting

2019-05-12 06:30发布

我试图通过PID获取进程的路径,但我发现Win32Exception(访问ID被拒绝)。

代码如下所示:

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

我一直在使用OpenProcess与GetModuleFileNameEx尝试,但OpenProcess将返回0。我甚至尝试使SeDebugPrivilege根据C# -如何启用SeDebugPrivilege ,但它并没有帮助。

上面的代码适用于大多数的过程,但会引发错误SynTPHelper.exe(Synaptics的定位设备辅助)的应用程序相同的用户名作为我的代码下运行。 这两个,我的应用程序和进程的64位运行。

是否有可能检索路径,而不运行我的应用程序作为管理员?

编辑

任务管理器是能够“打开文件位置”即使我不运行它为管理员。

Answer 1:

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


Answer 2:

那么,它肯定不是闻所未闻的服务,以移除访问权限,因此即使管理员无法打开的过程。 服务有足够的权限这样做,DRM组件,如audiodg.exe容易做到这一点。 鼠标垫助手不打我的东西,就需要这种保护。 但是,嘿,为什么会有人永远需要惹鼠标垫帮手?



文章来源: Access denied while getting process path