0

我试图通过在 select-xml 和Get-WinEvent. 但有些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>
4

1 回答 1

0

问题是因为它们不是同一类型的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 只返回匹配任一表达式的所有节点。

于 2019-02-05T23:44:28.350 回答