【问题标题】:Windows Event LogWindows 事件日志
【发布时间】:2013-08-13 22:58:18
【问题描述】:

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

【问题讨论】:

    标签: c# .net windows vb.net visual-studio


    【解决方案1】:

    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 块中,因为并非所有源都允许条目编写的侦听器(安全性应该可以正常工作)。如果需要,注释掉的部分会显示一个读取所有日志的示例。

    【讨论】:

      猜你喜欢
      • 2012-02-27
      • 1970-01-01
      • 2016-02-04
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多