【问题标题】:How to Query for an event log details with a given event id?如何查询具有给定事件 ID 的事件日志详细信息?
【发布时间】:2021-06-01 17:19:43
【问题描述】:
  1. 如何知道是否记录了特定事件(给定事件 ID、时间和节点作为输入)? [在这种情况下,我知道只会记录一个事件]
  2. 如果记录了事件,我如何获取事件描述、日志名称等详细信息。

例如,我想在节点 Applications and Services Logs > Microsoft > Windows > groupPolicy > Operational 下查询一个事件,事件 id 为 5315,时间为当前时间。

【问题讨论】:

    标签: c# events


    【解决方案1】:

    如果您要从新样式的 Windows 事件日志中查询事件,会有一些新变化。

    1. 您必须使用 System.Diagnostics.Eventing.Reader 命名空间中的类来读取新事件。
    2. 您的查询将采用 Xpath 形式,因此时间值很棘手,请参阅 msdn 以获取 EventLogQuery definition
    3. 您的程序将遇到访问问题,请准备好模拟登录机器上 EventReaders AD 组中包含的用户。

    此示例显示了一些新的访问方法:

    string eventID = "5312";
    string LogSource = "Microsoft-Windows-GroupPolicy/Operational";  
    string sQuery = "*[System/EventID=" + eventID + "]";
    
    var elQuery = new EventLogQuery(LogSource, PathType.LogName, sQuery);
    using (var elReader = new System.Diagnostics.Eventing.Reader.EventLogReader(elQuery))
    {
    
        List<EventRecord> eventList = new List<EventRecord>();
        EventRecord eventInstance = elReader.ReadEvent();
        try
        {
            for (null != eventInstance; eventInstance = elReader.ReadEvent())
            {
                //Access event properties here:
                //eventInstance.LogName;
                //eventInstance.ProviderName;
                eventList.Add(eventInstance);
            }
        }
        finally
        {
            if (eventInstance != null)
                eventInstance.Dispose();
        }
    }
    

    【讨论】:

    • 如何在给定日期内获取事件? query = "*[System[" + "(Provider/@Name=\"Microsoft Office 15 Alerts\") 和 " + //"(EventID=300) 和 " + "(TimeCreated/@SystemTime >= \" " + t1 + "\") 和 " + "(TimeCreated/@SystemTime <= \"" + t2 + "\")" + "]]";我收到查询异常
    • 如果我想查看 Windows 日志/系统,LogSource 是什么?
    • elReader 应该包含在 using 语句中
    • 您是否应该处理 eventInstance 的每个实例——而不仅仅是最后一个?
    【解决方案2】:

    您可以查询相关事件日志:

    var sourceName = "MySource";
    var el = new EventLog("Application");
    var latestEntryTime = (from entry in el.Entries.Cast<EventLogEntry>()
                           where entry.Source == sourceName
                           && // put other where clauses here...
                           orderby entry.TimeWritten descending
                           select entry).First();
    

    但是,请注意,这种方法缓慢,因为Entries 集合往往很大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      相关资源
      最近更新 更多