Process.MainModule -> «Доступ запрещен» - PullRequest
7 голосов
/ 08 декабря 2011

Я хочу справиться с этим по-другому, то есть. определите, есть ли у меня доступ или нет.

Можно ли посмотреть, есть ли у вас доступ к основному модулю или нет?

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 
            }
        }

Ответы [ 3 ]

4 голосов
/ 22 декабря 2011

Если это происходит в Windows 7 или Vista только с повышенными процессами, то вы можете получить путь к процессу напрямую, используя win api, не получая сообщение об ошибке отказа в доступе.

См. Ссылки:

Доступ запрещен при получении пути к процессу

Как получить повышенный путь к процессу в .Net

3 голосов
/ 08 декабря 2011

Я вижу две возможные причины исключения:

  1. Возможно, ваш процесс x86, а запрашиваемый процесс x64 или наоборот.
  2. У каждого процесса есть так называемый ACL (список контроля доступа), в котором описывается, кто может с ним взаимодействовать; процессы, с которыми у вас возникают проблемы, по соображениям безопасности имеют пустой ACL, поэтому даже администратор не может связываться с ними. Например, есть несколько процессов (audiodg, System и Idle), которые выдают исключение из-за прав доступа.

Просто используйте try / catch для вашего цикла, чтобы справиться с этими процессами.

2 голосов
/ 01 сентября 2017
  [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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...