Hi,
i got the following xml structure and want to select just the the “Data” node with the attribute “CommandLine” without defining a namespace object first.
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> <System> <Provider Name="Microsoft-Windows-Sysmon" Guid="{5770385f-c22a-43e0-bf4c-06f5698ffbd9}" /> <EventID>1</EventID> <Version>5</Version> <Level>4</Level> <Task>1</Task> <Opcode>0</Opcode> <Keywords>0x8000000000000000</Keywords> <TimeCreated SystemTime="2023-09-25 22:22:32.601" /> <EventRecordID>124756</EventRecordID> <Correlation /> <Execution ProcessID="4168" ThreadID="5480" /> <Channel>Microsoft-Windows-Sysmon/Operational</Channel> <Computer>myCOmputer.myDomain.org</Computer> <Security UserID="S-1-5-18" /> </System> - <EventData> <Data Name="RuleName">-</Data> <Data Name="UtcTime">2023-09-25 22:22:32.601</Data> <Data Name="ProcessGuid">{e8ff26e2-7b88-6511-dbe6-010000003e00}</Data> <Data Name="ProcessId">7240</Data> <Data Name="Image">C:\Windows\System32\conhost.exe</Data> <Data Name="FileVersion">10.0.19041.3393 (WinBuild.160101.0800)</Data> <Data Name="Description">Console Window Host</Data> <Data Name="Product">Microsoft® Windows® Operating System</Data> <Data Name="Company">Microsoft Corporation</Data> <Data Name="OriginalFileName">CONHOST.EXE</Data> <Data Name="CommandLine">\??\C:\Windows\system32\conhost.exe 0xffffffff -ForceV1</Data> <Data Name="CurrentDirectory">C:\Windows</Data> <Data Name="User">myUser</Data> <Data Name="LogonGuid">{e8ff26e2-3dbf-6511-eec4-160000000000}</Data> <Data Name="LogonId">0x16c4ee</Data> <Data Name="TerminalSessionId">0</Data> <Data Name="IntegrityLevel">High</Data> <Data Name="Hashes">SHA1=805D59ABED301A4A8219531544EDC1742207F8AD,MD5=7366FBEFE66BA0F1F5304F7D6FEF09FE,SHA256=5C7AA6C7D6CC9B7BF66B39BFBA334DE236EEFDD5E790545CED4C2E42600F8794,IMPHASH=0F64302D3280DE299F4C51A78746F606</Data> <Data Name="ParentProcessGuid">{e8ff26e2-7b88-6511-dae6-010000003e00}</Data> <Data Name="ParentProcessId">12168</Data> <Data Name="ParentImage">cmd.exe</Data> <Data Name="ParentCommandLine">dmc.exe 6384</Data> <Data Name="ParentUser">myUser</Data> </EventData> </Event>
This can be done by XPATH and the local-name() function. Environment is Powershell/.NET. .NET only supports XPATH 1.0 queries.
In this example the XML Object is in the variable $XML. The local-name()=’Data’ sets a filter for all nodes with Name Data and @Name filters the attribute where Name=CommandLine.
PS D:\> $XML.Event.EventData.SelectNodes("*[local-name()='Data' and @Name='CommandLine']") Name #text ---- ----- CommandLine \??\C:\Windows\system32\conhost.exe 0xffffffff -ForceV1
I know in this example Name=CommandLine would be sufficient 🙂
Michael