get-winevent -filterxpath против select-xml - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь лучше понять xpath, пробуя одно и то же в select-xml и Get-WinEvent.Но некоторые Get-WinEvent шаблоны, похоже, не работают в Select-Xml.Я получаю:

выражение должно вычисляться как набор узлов

Это работает, если я поставлю "|"вместо первого «а».Я сделал XML-файл из журнала Windows.Я думаю, вы не можете "и" два пути во второй команде?Я думаю, это должно быть

*[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 Ответ

0 голосов
/ 06 февраля 2019

Проблема в том, что они не одного типа XPath.Get-WinEvent использует Filter XPath (-FilterXPath), в то время как Select-XML является прямым -XPath выбором, и вы не можете использовать оба взаимозаменяемо.

Т.е. Get-WinEvent youзаписать выражение 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 просто возвращает все узлы, соответствующие любому из выражений.

...