系统.ArgumentException和System.ComponentModel.获取进程信息时出现Win32Exc
本文关键字:信息 Win32Exc 取进程 获取 ArgumentException System ComponentModel 系统 | 更新日期: 2023-09-27 18:16:40
当我尝试将进程信息写入控制台时,我得到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()
简短的回答是,您无法摆脱异常。当我运行这段代码时,我看到了一些在文档中没有显式调用的异常:
- Win32Exception - Access Denied:该进程以用户身份运行,当前用户没有访问该进程的权限。请注意,即使以管理员身份运行,您也无法访问所有进程(例如,由于DRM限制,audiodg.exe)
- Win32Exception - 32位进程无法访问64位进程的模块
- Win32Exception -无法枚举进程模块-我看到这种情况发生在伪进程System和Idle上-它们不是真正的进程(它们是内核服务的占位符)并且没有任何模块要列出。
根据Microsoft,如果进程在调用Process.GetProcesses()
和访问processLite[i].MainModule
之间退出,则得到ArgumentException
检查processLite[i].HasExited
可能有帮助,但不能保证,因为在您进行下一次调用之前,仍有足够的时间让进程退出。
只是一个想法,但是当您输出信息时,您不应该确保流程仍在运行吗?我认为列表可能只是对进程的引用,当您尝试访问属性时,它试图重新调用现在不存在的进程。