C#读取Windows事件日志时无法找到USB插入事件ID2003的求助
解决C#查询USB插拔事件(EventID 2003/2102)失败的问题
问题根源
直接通过EventID=2003查询会匹配所有日志中ID为2003的事件,而USB插拔的2003/2102事件属于特定提供者Microsoft-Windows-DriverFrameworks-UserMode,单独查EventID会被其他提供者的同名ID干扰;另外这类事件大概率不在你指定的System日志中,导致无法精准定位目标事件。
解决方案
1. 组合提供者与EventID的精准查询
修改查询语句,同时指定事件提供者和目标EventID,确保只过滤出USB插拔相关事件:
string query = "*[System[Provider/@Name='Microsoft-Windows-DriverFrameworks-UserMode' and EventID=2003]]";
查询拔出事件(EventID 2102)时,把语句中的2003替换为2102即可。
2. 确认事件所在的日志通道
这类设备操作事件通常存放在专门的操作日志中:
- 打开事件查看器,导航到
应用程序和服务日志 > Microsoft > Windows > DriverFrameworks-UserMode > Operational - 检查该日志中是否存在EventID 2003/2102的事件
如果事件确实在这里,需要修改代码中的日志名称:
EventLogQuery eventsQuery = new EventLogQuery("Microsoft-Windows-DriverFrameworks-UserMode/Operational", PathType.LogName, query);
3. 确保程序以管理员权限运行
部分系统事件日志需要管理员权限才能读取,右键点击程序或开发工具,选择「以管理员身份运行」后再测试。
修改后的完整代码示例
using System.Diagnostics.Eventing.Reader; class Program { static void Main(string[] args) { // 组合提供者和EventID的查询语句 string query = "*[System[Provider/@Name='Microsoft-Windows-DriverFrameworks-UserMode' and EventID=2003]]"; // 如果事件在Operational日志,替换为对应的日志名称 EventLogQuery eventsQuery = new EventLogQuery("Microsoft-Windows-DriverFrameworks-UserMode/Operational", PathType.LogName, query); try { EventLogReader logReader = new EventLogReader(eventsQuery); for (EventRecord eventdetail = logReader.ReadEvent(); eventdetail != null; eventdetail = logReader.ReadEvent()) { Console.WriteLine($"事件ID: {eventdetail.Id}"); Console.WriteLine(eventdetail.FormatDescription()); Console.WriteLine("---"); } } catch (EventLogNotFoundException e) { Console.WriteLine("指定的日志不存在或无法访问: " + e.Message); return; } catch (UnauthorizedAccessException e) { Console.WriteLine("权限不足,请以管理员身份运行程序: " + e.Message); return; } Console.WriteLine("Done"); Console.ReadLine(); } }
内容的提问来源于stack exchange,提问作者KrissNC
相关产品推荐
相关产品推荐

