在存档的Windows事件日志中搜索特定事件ID

时间:2013-08-08 14:42:41

标签: c# windows parsing event-log

情况:我在服务器上有许多旧的安全事件日志(大约18 GB)。日志作为evt文件保存在专用HDD分区上( - >日志不包含在事件查看器中)。

想要:我想在每个日志中搜索特定的事件ID。

问题:我无法打开事件日志文件,该文件未包含在EventLog-Class的事件查看器中

想法:我使用的是.NET EventLogClassEventLog log = new EventLog();
但我不能参考特定的事件日志文件,它位于另一个硬盘分区上。

在我看来,我尝试过各种可能的方式:

EventLog log = new EventLog(filepath, Computername)
EventLog log = new EventLog(filepath, ".")
EventLog log = new EventLog(filename, Computername, filepath)
EventLog log = new EventLog(filename, ".", filepath)

在前两个,错误消息显示,没有像“\”这样的特殊字符允许。在最后两个,有错误消息说,在计算机上找不到这样的文件“文件名”(我认为他在事件日志中搜索,在事件查看器中“包含”)

问题:我想打开这样的文件 - 如果它与我的想法所使用的类一起工作并不重要。我只想搜索事件ID,如果找到特定的id,将整个事件导出到txt,csv或其他任何内容。

提前致谢!

1 个答案:

答案 0 :(得分:0)

以下是将事件文件和ID作为参数的方法,它返回EventRecord

public static EventRecord GetEventRecord(string eventFile, int eventID)
{
  var xpathQuery = string.Format("*[System/EventID={0}]", eventID);
  var query = new EventLogQuery(eventFile, PathType.FilePath, xpathQuery);
  var reader = new EventLogReader(query);
  return reader.ReadEvent();
}

用法示例:

static void Main(string[] args)
{
  var rec = GetEventRecord(@"w:\kanta\eventi.evtx", 903);
  /// due to a bug you have to set current culture to en-US or FormatDescription won't work
  /// https://connect.microsoft.com/VisualStudio/feedback/details/498054/net-3-5-sp1-eventrecord-formatdescription#
  Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
  Console.Write(rec.FormatDescription());
  Console.ReadKey();
}