代码之家  ›  专栏  ›  技术社区  ›  Giorgi

获取进程路径时拒绝访问

  •  6
  • Giorgi  · 技术社区  · 15 年前

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

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

    我曾尝试将OpenProcess与GetModuleFileNameEx一起使用,但OpenProcess返回0。我甚至试着根据 C# – How to enable SeDebugPrivilege 但没用。

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

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

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

    2 回复  |  直到 5 年前
        1
  •  15
  •   Giorgi    15 年前

    最后我终于解决了。事实证明,Vista及更高版本中有一个新功能,用于获取进程路径和新的进程访问(进程\查询\有限\信息):

    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;
        }
    
        2
  •  1
  •   Hans Passant    15 年前

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

    推荐文章