有人能告诉我为什么下面的选择不起作用吗?我没有收到错误。他们什么也没有回报。
下面的xml是转换为xml的实际事件日志项。我只更改了一些值,以确保不会在这篇文章中提供私人信息。
$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/>
标记中的属性,格式正确。
对此有任何见解将不胜感激。
答案 0 :(得分:2)
使用XML时这是一个经典问题;您的XML具有默认命名空间(xmlns="...."
)。命名空间定义的元素及其所有后代没有前缀,并且在同一命名空间中没有考虑不同的默认命名空间声明。
为了能够访问命名空间中的元素,您必须声明一个指向命名空间URI的前缀,并在XPath查询中使用该前缀,例如:
.......
$ns = New-Object System.Xml.XmlNamespaceManager($x.NameTable)
$ns.AddNamespace("ns", $x.DocumentElement.NamespaceURI)
$x.SelectNodes("/ns:Event/ns:EventData", $ns)