System.argumentException и System.componentmodel.win32exception при получении информации о процессе

StackOverflow https://stackoverflow.com/questions/8369811

Вопрос

Когда я пытаюсь написать информацию о процессе в консоли, я получаю 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()
Это было полезно?

Решение

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

  1. Win32exception - Доступ отказан: процесс работает как пользователь, и ваш текущий пользователь не имеет права доступа к процессу. Примечание даже при запуске в качестве администратора у вас не будет доступа ко всем процессам (например, Audiodg.exe из -за ограничений DRM)
  2. Win32Exception - 32 -битные процессы не могут получить доступ к модулям 64 -битного процесса
  3. Win32exception - невозможно перечислять модули процесса - я вижу, что это происходит в системе псевдо процессов и холостого хода - это не реальные процессы (они являются владельцами места для сервисов ядра), и у них нет никаких модулей для перечисления.

Другие советы

По словам Microsoft, Вы получаете ArgumentException Если процесс выходит между тем временем, которое вы позвонили Process.GetProcesses() И время, когда вы получаете доступ processLite[i].MainModule

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top