Process.MainModule – >“访问被拒绝”

我想以不同的方式处理这个问题,即。 确定我是否有权访问。

是否可以查看您是否可以访问主模块?

foreach (Process p in Process.GetProcesses()) { try { //This throws error for some processes. if (p.MainModule.FileName.ToLower().EndsWith(ExeName, StringComparison.CurrentCultureIgnoreCase)) { //Do some stuff } } catch (Exception) { //Acess denied } } 

如果在具有提升的进程的Windows 7或Vista上发生这种情况,那么您可以使用win api直接获取进程路径而不会出现访问被拒绝错误。

看到这个链接:

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

如何在.Net中获得提升的流程路径

我看到了两个可能的exception原因:

  1. 可能是您的进程是x86,正在查询的进程是x64,反之亦然。
  2. 每个进程都有一个所谓的ACL(访问控制列表),它描述了谁可以与它进行交互,你遇到问题的进程出于安全原因而出现空ACL,所以即使是管理员你也不能搞砸它们。 例如,由于访问权限,有一小部分进程(audiodg,System和Idle从头顶开始)抛出exception。

只需在循环中使用try / catch来处理这些进程。

  [Flags] private enum ProcessAccessFlags : uint { QueryLimitedInformation = 0x00001000 } private static extern bool QueryFullProcessImageName( [In] IntPtr hProcess, [In] int dwFlags, [Out] StringBuilder lpExeName, ref int lpdwSize); [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr OpenProcess( ProcessAccessFlags processAccess, bool bInheritHandle, int processId); String GetProcessFilename(Process p) { int capacity = 2000; StringBuilder builder = new StringBuilder(capacity); IntPtr ptr = OpenProcess(ProcessAccessFlags.QueryLimitedInformation, false, p.Id); if (!QueryFullProcessImageName(ptr, 0, builder, ref capacity)) { return String.Empty; } return builder.ToString(); } 

使用pinvoke与ProcessAccessFlags.QueryLimitedInformation 。 这将允许您在没有特殊管理员权限的情况下获取进程的文件名,并且可以跨x32和x64进程工作。