get-winevent -filterxpath vs select-xml



我试图通过在select xml和Get-WinEvent中尝试相同的东西来更好地理解xpath。但有些Get-WinEvent模式在Select-Xml中似乎不起作用。我得到:

表达式必须计算为节点集

如果我放"|"而不是第一个"one_answers",它就会起作用。我从windows日志中创建了一个xml文件。我猜你不能在"one_answers"两条路径的第二个命令?我想应该是

*[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>

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

例如,Get-WinEvent您编写了一个XPath Filter表达式来进行筛选(从文档中删除与查询不匹配的节点)。

对于Select-XML,您可以将XPath表达式写入选择要返回的节点。当编写的查询无法确定如何返回特定节点时,您会得到错误

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

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

|之所以有效,是因为|是联合(|)运算符。它正在返回两个表达式的并集。事实上,如果我们将表达式一分为二,两个表达式都会各自发挥作用:

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只返回与任一表达式匹配的所有节点。

相关内容

  • 没有找到相关文章

最新更新