使用 XPath 处理 select 与 Windows 事件日志中其他条件不匹配的事件

Using XPath to select events that do not match other criteria in Windows event logs

我正在尝试开发一个兼容 Xpath 1.0 的过滤器,该过滤器遵守对 Using XPath starts-with or contains functions to search Windows event logs 的回答中指出的限制,只要它们没有特定的计算机名称,它就会匹配事件 ID 为 4771 的事件.这是我不想在事件查看器中 match/display 的 4771 事件的示例 xml。

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
 <System>
  <Provider Name="Microsoft-Windows-Security-Auditing" Guid="{94849225-5448-4994-A5BA-1E3B0928C30D}" /> 
  <EventID>4771</EventID> 
  <Version>0</Version> 
  <Level>0</Level> 
  <Task>14339</Task> 
  <Opcode>0</Opcode> 
  <Keywords>0x8010000000000000</Keywords> 
  <TimeCreated SystemTime="2017-03-22T20:13:28.105262600Z" /> 
  <EventRecordID>4368371459</EventRecordID> 
  <Correlation /> 
  <Execution ProcessID="564" ThreadID="1340" /> 
  <Channel>Security</Channel> 
  <Computer>sample.computer.net</Computer> 
  <Security /> 
  </System>
 <EventData>
  <Data Name="TargetUserName">abc$</Data> 
  <Data Name="TargetSid">S-1-5-21-376469911-3458163162-136990061-477177</Data> 
  <Data Name="ServiceName">krbtgt/computer.net</Data> 
  <Data Name="TicketOptions">0x40810010</Data> 
  <Data Name="Status">0x18</Data> 
  <Data Name="PreAuthType">2</Data> 
  <Data Name="IpAddress">::ffff:10.0.0.1</Data> 
  <Data Name="IpPort">56815</Data> 
  <Data Name="CertIssuerName" /> 
  <Data Name="CertSerialNumber" /> 
  <Data Name="CertThumbprint" /> 
  </EventData>
  </Event>

这是我试过的不成功的过滤器。显示的事件未被正确过滤掉,即未正确处理 targetusername 排除。

<QueryList>
  <Query Id="0" Path="ForwardedEvents">
    <Select Path="ForwardedEvents">*[System[(EventID=4771)]] and *[EventData[Data[@Name='TargetUserName'] and (Data!='abc$')]]</Select>
  </Query>
</QueryList>

看来 (Data!='abc$') 部分已应用于所有数据元素,只要有一个数据元素与指定值不匹配,整个事件就会匹配。目的是如果存在 Data 元素与 TargetUserName 属性的组合并且该元素的值为 abc$,则整个事件不应匹配。

在正常的 XPath 1.0 环境中,我们可以按照您描述的方式进行操作:

*[System/EventID=4771 and EventData/Data[@Name='TargetUserName' and .!='abc$']]

显然 Windows 事件日志的 XPath 不支持以下任何一种,这让我们陷入了死胡同:.self::text()node()。我们可以使用 XPath 获得的最接近的可能是假设 'TargetUserName',如果存在于给定的 EventData,总是出现在第一个 Data 子节点中,所以我们可以如下操作:

*[System/EventID=4771 and EventData[Data[1]/@Name='TargetUserName' and Data[1]!='abc$']]

你没看错

*[EventData[Data[@Name='TargetUserName'] and (Data!='abc$')]]

匹配任何不是 'abc$' 的数据元素。你想要的是只考虑 TargetUserName 个元素。

*[EventData[Data[@Name='TargetUserName']!='abc$']]