xml - PowerShell 事件日志 xml xpath 选择不起作用

标签 xml windows powershell xpath event-log

有人能告诉我为什么下面的选择不起作用吗?我没有收到错误。他们只是不返​​回任何内容。

下面的 xml 是转换为 xml 的实际事件日志项。我只更改了一些值,以确保本文中不会出现私有(private)信息。

$Str表示单个事件日志项的输出。即$event.ToXml() .

$str = @"
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Microsoft-Windows-Security-Auditing" Guid="{54849625-5478-4994-A5BA-3E3B0328C30D}" />
    <EventID>4624</EventID>
    <Version>0</Version>
    <Level>0</Level>
    <Task>12544</Task>
    <Opcode>0</Opcode>
    <Keywords>0x8020000000000000</Keywords>
    <TimeCreated SystemTime="2014-06-05T12:41:42.490143500Z" />
    <EventRecordID>425650</EventRecordID>
    <Correlation />
    <Execution ProcessID="636" ThreadID="2084" />
    <Channel>Security</Channel>
    <Computer>SERVERHOSTNAME.some.domain.here</Computer>
    <Security />
  </System>
  <EventData>
    <Data Name="SubjectUserSid">S-1-0-0</Data>
    <Data Name="SubjectUserName">-</Data>
    <Data Name="SubjectDomainName">-</Data>
    <Data Name="SubjectLogonId">0x0</Data>
    <Data Name="TargetUserSid">S-1-x-xx</Data>
    <Data Name="TargetUserName">SERVERHOSTNAME$</Data>
    <Data Name="TargetDomainName">TESTDOM</Data>
    <Data Name="TargetLogonId">0x0000000</Data>
    <Data Name="LogonType">3</Data>
    <Data Name="LogonProcessName">Kerberos</Data>
    <Data Name="AuthenticationPackageName">Kerberos</Data>
    <Data Name="WorkstationName"></Data>
    <Data Name="LogonGuid">{00000000-0000-0000-0000-000000000000}</Data>
    <Data Name="TransmittedServices">-</Data>
    <Data Name="LmPackageName">-</Data>
    <Data Name="KeyLength">0</Data>
    <Data Name="ProcessId">0x0</Data>
    <Data Name="ProcessName">-</Data>
    <Data Name="IpAddress">::1</Data>
    <Data Name="IpPort">0</Data>
  </EventData>
</Event>
"@
[xml]$x = $str

#Why isn't this select working?
$x.SelectNodes("/Event/EventData")

#what I am actually trying to accomplish is selecting the value 
#associated to specific attributes, i.e.
$UserSid = $x.SelectSingleNode("/Event/EventData/Data[@name='TargetUserSid']").Value
$UserName = $x.SelectSingleNode("/Event/EventData/Data[@name='TargetUserName']").Value

我只是一个 XML 专家,无法理解为什么这些选择不起作用。该 xml 具有命名空间(作为 <event/> 标记中的属性,并且格式正确。

任何对此的见解将不胜感激。

最佳答案

这是使用 XML 时的一个典型问题;您的 XML 有默认命名空间 (xmlns="....")。定义 namespace 的元素及其所有没有前缀且没有不同默认 namespace 声明的后代都被视为在同一 namespace 中。

为了能够访问命名空间中的元素,您必须声明一个指向命名空间 URI 的前缀,并在 XPath 查询中使用该前缀,例如:

.......
$ns = New-Object System.Xml.XmlNamespaceManager($x.NameTable)
$ns.AddNamespace("ns", $x.DocumentElement.NamespaceURI)
$x.SelectNodes("/ns:Event/ns:EventData", $ns)

关于xml - PowerShell 事件日志 xml xpath 选择不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24080627/

相关文章:

javascript - 解析 XML 文件不起作用

powershell - 从 powershell 脚本调用可执行文件(带参数)

powershell 脚本未正确枚举添加成员的 scriptproperty 输入

java - 使用RML-Mapper库将xml文件转换为RDF的最佳mapping.ttl文件是什么?

c# - 读取奇怪的 XML 文件

Python 使用 BS4 在整个 XML 中添加子子元素

html - 电源外壳 : split HTML

Windows批处理结合 CoffeeScript ,复制和丑化

python - 在 Windows 上通过 PIP 安装 AWS CLI v2

c# - 如何使用 C# 验证 PowerShell 脚本是否正在运行