2014-06-06 18 views
2

任何人都可以告訴我爲什麼下面的選擇不起作用?我沒有得到錯誤。他們只是沒有返回。PowerShell事件日誌xml xpath選擇不工作

下面的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/>標籤中的屬性和格式正確無誤

任何深入瞭解這將不勝感激

回答

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) 
+0

感謝您的回覆。它幫助我分類。乾杯! – Taoism