c# – 获取进程路径时拒绝访问

我试图通过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位运行.

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

编辑

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

解决方法

最后我设法解决了这个问题.事实证明,在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,buff,out size))
                {
                    return buffer.ToString();
                }
            }
            finally
            {
                CloseHandle(hprocess);
            }
        }
        return string.Empty;
    }

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...