get-winevent -filterxpath 与 select-xml

Posted

技术标签:

【中文标题】get-winevent -filterxpath 与 select-xml【英文标题】:get-winevent -filterxpath vs select-xml 【发布时间】:2019-02-05 22:10:06 【问题描述】:

我试图通过在 select-xml 和 Get-WinEvent 中尝试相同的事情来更好地理解 xpath。但是一些Get-WinEvent 模式似乎在Select-Xml 中不起作用。我明白了:

表达式必须计算为节点集

如果我输入“|”它会起作用而不是第一个“和”。我从 Windows 日志中创建了一个 xml 文件。我猜你不能在第二个命令中“和”两条路径?我想应该是

*[System[EventID=4624] and EventData[Data [@Name='TargetUserName'] and Data='testuser']]

Get-WinEvent 更宽容。

# works ok (login event)
Get-WinEvent Security -FilterXPath "*[System[EventID=4624]] and 
  *[EventData[Data[@Name='TargetUserName'] and Data='testuser']]"

# error
# "| select -expand node" if you want the xml object
select-xml "*[System[EventID=4624]] and 
  *[EventData[Data [@Name='TargetUserName'] and Data='testuser']]" event.xml

select-xml : Expression must evaluate to a node-set.
At line:1 char:2
+ select-xml "*[System[EventID=4624]] and *[EventData[Data [@Name='Tar ...
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     + CategoryInfo          : NotSpecified: (:) [Select-Xml], XPathException
     + FullyQualifiedErrorId : System.Xml.XPath.XPathException,Microsoft.PowerShell.Commands.SelectXmlCommand

这是一个简化的 event.xml:

<Event>
  <System>
    <EventID>4624</EventID> 
  </System>
  <EventData>
    <Data Name="TargetUserName">testuser</Data> 
  </EventData>
</Event>

【问题讨论】:

【参考方案1】:

问题是因为它们与XPath 的类型不同。 Get-WinEvent 使用 Filter XPath (-FilterXPath),而 Select-XML 是直接的 -XPath 选择,不能互换使用。

Get-WinEvent 你写了一个XPath Filter 表达式来过滤(从文档中删除与查询不匹配的节点)。

对于Select-XML,您将XPath 表达式写入选择 节点以返回。当查询被写入它无法弄清楚如何返回特定节点时,您会收到错误

表达式必须计算为节点集。

因为,事实上,您没有返回特定节点。

| 之所以起作用是因为| 是Union (|) Operator。它返回两个表达式的并集。事实上,如果我们将表达式一分为二,这两个表达式都会各自发挥作用:

PS> select-xml "*[System[EventID=4624]]" event.xml

Node  Path        Pattern
----  ----        -------
Event InputStream *[EventData[Data [@Name='TargetUserName'] and Data='testuser']]

PS> select-xml " *[EventData[Data [@Name='TargetUserName'] and Data='testuser']]" event.xml

Node  Path        Pattern
----  ----        -------
Event InputStream *[EventData[Data [@Name='TargetUserName'] and Data='testuser']]

因为表达式的每一半都可以针对特定节点进行计算,所以它可以工作。 Union 只返回匹配任一表达式的所有节点。

【讨论】:

我不知道。 And-ing 两条路径,如“* 和 *”,看起来像是某种 Microsoft 扩展或错误。我在其他任何地方都看不到它。您会在 Windows 日志 xml 过滤器中更频繁地看到它。

以上是关于get-winevent -filterxpath 与 select-xml的主要内容,如果未能解决你的问题,请参考以下文章

get-winevent 输出到以二进制形式存储的文件

如何通过 `Get-WinEvent` 和 Date Created 事件属性获取准确的事件系统时间?

Get-WinEvent 仅获取交互式登录消息

如何获取与 0x1 或 0x4 匹配的 Powershell > Get-WinEvent > Security > Message > Access Mask

使用 PowerShell 检查新创建的本地管理员

从 Window 日志的 .evtx 文件中提取审计事件信息