情况:我在服务器上有许多旧的安全事件日志(大约18 GB)。日志作为evt文件保存在专用HDD分区上( - >日志不包含在事件查看器中)。
想要:我想在每个日志中搜索特定的事件ID。
问题:我无法打开事件日志文件,该文件未包含在EventLog-Class的事件查看器中
想法:我使用的是.NET EventLogClass。 EventLog 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或其他任何内容。
提前致谢!
答案 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();
}