System.ArgumentException и System.ComponentModel.Win32Exception при получении информации о процессе

Когда я пытаюсь записать информацию о процессе в консоль, я получаю System.ArgumentException и System.ComponentModel.Win32Exception. Что вызывает это? Как мне перестать их иметь?

        Process processListe = Process.GetProcesses();


            for (int i = 0; i < processListe.Count(); i++)
            {
                try
                {
                string companyName = processListe[i].MainModule.FileVersionInfo.CompanyName;
                string fileVersion = processListe[i].MainModule.FileVersionInfo.FileVersion;

                Console.WriteLine(companyName  + " " + fileVersion);


                }
                catch (Exception) { }


            }

Ошибки возникают в "string companyName = processListe[i].MainModule.FileVersionInfo.CompanyName;" линия.

Сообщения об ошибках:

   System.ArgumentException: Illegal characters in path.
   at System.Security.Permissions.FileIOPermission.HasIllegalCharacters(String[] str)
   at System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access, AccessControlActions control, String[] pathListOrig, Boolean checkForDuplicates, Boolean needFullPath, Boolean copyPathList)
   at System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess access, String[] pathList, Boolean checkForDuplicates, Boolean needFullPath)
   at System.IO.Path.GetFullPath(String path)
   at System.Diagnostics.FileVersionInfo.GetFullPathWithAssert(String fileName)
   at System.Diagnostics.FileVersionInfo.GetVersionInfo(String fileName)
   at System.Diagnostics.ProcessModule.get_FileVersionInfo()


   A first chance exception of type 'System.ComponentModel.Win32Exception' occurred in System.dll
   System.ComponentModel.Win32Exception (0x80004005): Unable to enumerate the process modules.
   at System.Diagnostics.NtProcessManager.GetModuleInfos(Int32 processId, Boolean firstModuleOnly)
   at System.Diagnostics.NtProcessManager.GetFirstModuleInfo(Int32 processId)
   at System.Diagnostics.Process.get_MainModule()

Наконец, я сделал вывод информации об этом процессе, который заставляет меня получать ошибки:

    Exception: Illegal characters in path.
    Proess Name: winlogon Company Name: Aestan Software Version: 1.6.1.33
    Detail: System.ArgumentException: Illegal characters in path.
   at System.Security.Permissions.FileIOPermission.HasIllegalCharacters(String[] str)
   at System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access, AccessControlActions control, String[] pathListOrig, Boolean checkForDuplicates, Boolean needFullPath, Boolean copyPathList)
   at System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess access, String[] pathList, Boolean checkForDuplicates, Boolean needFullPath)
   at System.IO.Path.GetFullPath(String path)
   at System.Diagnostics.FileVersionInfo.GetFullPathWithAssert(String fileName)
   at System.Diagnostics.FileVersionInfo.GetVersionInfo(String fileName)
   at System.Diagnostics.ProcessModule.get_FileVersionInfo()

    Exception: Illegal characters in path.
    Proess Name: csrss Company Name: Microsoft Corporation Version: 2009.0100.1600.01 ((KJ_RTM).100402-1540 )
    Detail: System.ArgumentException: Illegal characters in path.
at System.Security.Permissions.FileIOPermission.HasIllegalCharacters(String[] str)
   at System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access, AccessControlActions control, String[] pathListOrig, Boolean checkForDuplicates, Boolean needFullPath, Boolean copyPathList)
   at System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess access, String[] pathList, Boolean checkForDuplicates, Boolean needFullPath)
   at System.IO.Path.GetFullPath(String path)
   at System.Diagnostics.FileVersionInfo.GetFullPathWithAssert(String fileName)
   at System.Diagnostics.FileVersionInfo.GetVersionInfo(String fileName)
   at System.Diagnostics.ProcessModule.get_FileVersionInfo()

    Exception: Unable to enumerate the process modules.
    Proess Name: System Company Name: BitTorrent, Inc. Version: 7.5.0.25682
    Detail: System.ComponentModel.Win32Exception (0x80004005): Unable to enumerate the process modules. 
at System.Diagnostics.NtProcessManager.GetModuleInfos(Int32 processId, Boolean firstModuleOnly)
   at System.Diagnostics.NtProcessManager.GetFirstModuleInfo(Int32 processId)
   at System.Diagnostics.Process.get_MainModule()

    Exception: Access is denied
    Proess Name: Cheat Engine Company Name:  Version: 5.6.1.10
    Detail:  System.ComponentModel.Win32Exception (0x80004005): Access is denied
   at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
   at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
   at System.Diagnostics.Process.get_HasExited()

person platypus    schedule 03.12.2011    source источник
comment
Вы запускаете свое приложение от имени администратора или любого другого пользователя с правами администратора. Также, если вы можете опубликовать, какую строку и полное исключение?   -  person Surjit Samra    schedule 03.12.2011
comment
У меня права администратора. Добавлено сообщение об ошибке, кстати.   -  person platypus    schedule 03.12.2011
comment
@gcx - можете ли вы указать название процессов (.ProcessName), которые выдают вам эти ошибки?   -  person shf301    schedule 03.12.2011
comment
@ shf301 я добавил к своему исходному сообщению.   -  person platypus    schedule 03.12.2011
comment
@gcx Я понятия не имею, почему вы получаете недопустимые символы в исключениях пути. Может быть, попробуйте просмотреть их с помощью Process Explorer и посмотреть, что это вам покажет, или взломать эти процессы в отладчике и посмотреть, что вы можете увидеть.   -  person shf301    schedule 04.12.2011


Ответы (3)


Короткий ответ заключается в том, что вы не можете избавиться от исключений. Есть несколько исключений, которые я вижу, когда запускаю этот код, который я не вижу явно в документации:

  1. Win32Exception - Отказано в доступе: процесс выполняется от имени пользователя, и ваш текущий пользователь не имеет прав на доступ к процессу. Обратите внимание, что даже при работе от имени администратора у вас не будет доступа ко всем процессам (например, audiodg.exe из-за ограничений DRM).
  2. Win32Exception - 32-битные процессы не могут получить доступ к модулям 64-битного процесса
  3. Win32Exception - невозможно перечислить модули процесса - я вижу, что это происходит в псевдопроцессах System и Idle - они не являются реальными процессами (они являются заполнителями для служб ядра) и не имеют модулей для перечисления.
person shf301    schedule 03.12.2011
comment
У меня такая же проблема. Я обучил второе решение и скомпилировал свой код как 64-битное приложение. Это еще не решило. Первое было бы моим решением, я не знаю. Есть ли способ получить доступ к моему текущему пользователю. Даже я запускаю свой код от имени администратора, я все равно получаю сообщение об ошибке. Что я могу сделать для первого. - person Ahmet DAL; 19.01.2015

Согласно Microsoft, вы получаете ArgumentException, если процесс завершается между моментом, когда вы вызвали Process.GetProcesses(), и временем, когда вы обращаетесь к processLite[i].MainModule

Проверка processLite[i].HasExited может помочь, но это не гарантируется, потому что еще есть достаточно времени для завершения процесса, прежде чем вы сделаете следующий вызов.

person Sergey Kalinichenko    schedule 03.12.2011
comment
Я поставил операторы if перед получением информации MainModule, не помогло. - person platypus; 03.12.2011

Просто мысль, но не должны ли вы убедиться, что процесс все еще работает, когда вы получаете информацию? Я думаю, что список может быть просто ссылкой на процесс, и когда вы пытаетесь получить доступ к свойствам, он пытается повторно вызвать процесс, которого сейчас не существует.

person Martin    schedule 03.12.2011
comment
К сожалению, проверка того, завершился ли процесс, не помогла. - person platypus; 03.12.2011