C# EventViewer 日志解析

C# EventViewer Logs Parsing

我负责解析转发的EventViewer (evt) 日志(Windows 7?)。为此,我 运行 使用 Log Parser 2.2 对日志进行查询,提取特定的 EventID 并将它们写入 CSV 文件。但是,我正在考虑使用 EventViewerReader 来代替。

我在这些 evt 上做的查询包括一个 "strings" 列,它输出一堆垃圾,通常格式如下:SID|用户名|用户组|...但它不是持续的。我想要的是一种一致的方式来获取这些事件的用户名并过滤掉无用的数据。问题是我不明白输出的格式。我想知道这些事件是否具有标准格式,或者这是我工作中的自定义格式?我现在使用的方法基本上是查找已知的用户组并检查它们左侧的潜在用户名(跳过 "LOCALS SERVICE"、"NETWORK SERVICE"、“-”和其他一些关键字)。我对这种方法的问题是我不知道所有的用户组,而且我可能会误报用户名。

以下是我正在查看的一些 EventID Codeshttps://www.ultimatewindowssecurity.com/securitylog/quickref/downloads/quickref.zip

4624    An account was successfully logged on
4625    An account failed to log on
4647    User initiated logoff
4648    A logon was attempted using explicit credentials
4800    The workstation was locked
4801    The workstation was unlocked
4802    The screen saver was invoked
4803    The screen saver was dismissed

我最后仔细查看了 evt 文件,发现它们有一套 XML 模式。 "Strings" 实际上不是一个元素,而是 EventData 子数据元素的串联值。我所做的只是查看每个 EventID 的架构,并找到每个事件类型中用户名的深度。

我认为 logon/logoff 是 strings[5] (TargetUserName),其他几个是 strings[0],还有几个是 strings[1]。

<EventData>
  <Data Name="SubjectUserSid">S-1-5-18</Data> 
  <Data Name="SubjectUserName">XXX-PC$</Data> 
  <Data Name="SubjectDomainName">WORKGROUP</Data> 
  <Data Name="SubjectLogonId">0x3e7</Data> 
  <Data Name="TargetUserSid">S-1-5-18</Data> 
  <Data Name="TargetUserName">SYSTEM</Data> 
  <Data Name="TargetDomainName">NT AUTHORITY</Data> 
  <Data Name="TargetLogonId">0x3e7</Data>
...
</EventData>