0

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

想要:我想在每个日志中搜索特定的事件 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 或其他格式。

提前致谢!

4

1 回答 1

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();
}
于 2013-08-08T15:02:35.803 回答