使用 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$']]
我正在尝试开发一个兼容 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$']]