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()
3 ответа
Короткий ответ: вы не можете избавиться от исключений. Есть несколько исключений, которые я вижу, когда запускаю этот код, который я не вижу явно вызванным в документации:
- Win32Exception - доступ запрещен: процесс запущен как пользователь, и ваш текущий пользователь не имеет прав на доступ к процессу. Обратите внимание, что даже при работе от имени администратора у вас не будет доступа ко всем процессам (например, audiodg.exe из-за ограничений DRM)
- Win32Exception - 32-битные процессы не могут получить доступ к модулям 64-битного процесса
- Win32Exception - Невозможно перечислить модули процессов - я вижу, что это происходит в псевдопроцессах System и Idle - они не являются реальными процессами (они являются заполнителями для служб ядра) и не имеют никаких модулей для перечисления.
По словам Microsoft, вы получаете ArgumentException
если процесс завершается в промежутке между Process.GetProcesses()
и время доступа processLite[i].MainModule
проверка processLite[i].HasExited
может помочь, но это не гарантируется, потому что у процесса все еще достаточно времени для завершения, прежде чем вы сделаете следующий вызов.
Просто мысль, но разве вы не должны убедиться, что процесс все еще работает, когда вы выводите информацию? Я думаю, что список может быть просто ссылками на процесс, и когда вы пытаетесь получить доступ к свойствам, он пытается повторно вызвать процесс, который сейчас не существует.