Windows事件日志

本文关键字:日志 事件 Windows | 更新日期: 2023-09-27 18:27:29

我正在开发一个应用程序,用于从多个Windows系统捕获事件日志(安全性)。我有一个EntryWritten的处理程序。我能够将事件查看器中的大多数字段映射到.net中的EntryWrittenEventArgs条目。但是,我似乎找不到事件查看器中显示的级别、操作代码和任务类别字段的映射。关于如何在vb.net或c#中实现这一点,有什么想法吗?感谢

Windows事件日志

System.Diagnostics命名空间中的EventLog类不包含LevelOpCodeTask的字段。然而,在System.Diagnostics.Eventing.Reader命名空间中有一个EventRecord类能够返回这些字段。请注意,此命名空间主要用于从远程计算机检索事件日志。尽管您也可以使用它在本地计算机上获取日志,但它打开了一个到系统的本地管道,这使它比EventLog类慢。如果你真的需要访问这些字段,这个类通常是这样使用的:

    private void LoadEventLogs()
    {
        List<EventRecord> eventLogs = new List<EventRecord>();
        EventLogSession session = new EventLogSession();
        foreach (string logName in session.GetLogNames())
        {
            EventLogQuery query = new EventLogQuery(logName, PathType.LogName);
            query.TolerateQueryErrors = true;
            query.Session = session;
            EventLogWatcher logWatcher = new EventLogWatcher(query);
            logWatcher.EventRecordWritten += 
                   new EventHandler<EventRecordWrittenEventArgs>(LogWatcher_EventRecordWritten);
            try
            {
                logWatcher.Enabled = true;
            }
            catch (EventLogException) { }

            // This is how you'd read the logs
            //using (EventLogReader reader = new EventLogReader(query))
            //{
            //    for (EventRecord eventInstance = reader.ReadEvent(); eventInstance != null; eventInstance = reader.ReadEvent())
            //    {
            //        eventLogs.Add(eventInstance);
            //    }
            //}
        }
    }

以及LogWatcher_EventRecordWritten事件处理程序:

 private void LogWatcher_EventRecordWritten(object sender, EventRecordWrittenEventArgs e)
    {
        var level = e.EventRecord.Level;
        var task = e.EventRecord.TaskDisplayName;
        var opCode = e.EventRecord.OpcodeDisplayName;
        // Other properties
    }

请注意,我将logWatcher.Enabled = true;语句封装在try-catch块中,因为并非所有源都允许条目写入侦听器(安全性应该很好)。注释掉的部分向您展示了一个读取所有日志的示例,如果您需要的话。