读取包含复杂数据的Windows事件负载

在我以前的问题,我发布了我试图序列化的XML。 这是另一个XML示例:

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> <System> <Provider Name="XXXXXXXXXX" Guid="{YYYYYYYY}" /> <EventID>XYZ</EventID> <Version>0</Version> <Level>L</Level> <Task>A</Task> <Opcode>0</Opcode> <Keywords>0x000xyzh</Keywords> <TimeCreated SystemTime="2012-06-28T15:44:04.997837000Z" /> <EventRecordID>153</EventRecordID> <Correlation ActivityID="{DDDDDDDDD}" /> <Execution ProcessID="199999" ThreadID="90990" /> <Channel>Microsoft-Windows-ABCDEFG/Admin</Channel> <Computer>myPC</Computer> <Security UserID="ABCABC" /> </System> <EventData> <Data Name="name1">data1</Data> <Data Name="name2">data2</Data> <Data Name="name3">data3</Data> <ComplexData Name="XYZXYZ">0C004300310022002D004400460053005400450053002200310003004E0053003200230041002D00570041002D00320045004400000047006C002900620061006C0048006900670068005000720069006F007200240074006600120044006100730087000000000000000000000000000000</ComplexData> </EventData> <RenderingInfo Culture="en-US"> <Message>some message </Message> <Level>Information</Level> <Task>XYZ</Task> <Opcode>Info</Opcode> <Channel /> <Provider /> <Keywords> <Keyword>XYZ</Keyword> </Keywords> </RenderingInfo> </Event> 

一个区别是它有一个复杂的数据,这是一个结构,定义一个整数值的数组(长度以下string…等)和stringunicodes。 我想出了一种方法来逐字节地解码string,但我需要一个更清晰的方法来做到这一点。 如果EventRecord.ToXml()不是获取包括复杂数据/结构体/数组的事件有效负载的最佳方式,那么获取该数据/结构体/数组的最佳方式是什么? MSDN上有很多与Windows事件相关的类,我不知道要使用哪一个类。

谢谢

编辑:这里是我所了解ComplexData的一些示例:

  <data inType="win:UInt16" name="XYZLength" /> <data inType="win:UnicodeString" length="XYZLength" name="XYZ" /> 

这意味着前两个字节(低端格式)是以下unicodestring的长度,依此类推。 而对于那些没有长度的,我需要find16位零(2个字节的零)的空终止符。

Solutions Collecting From Web of "读取包含复杂数据的Windows事件负载"

 public class Event { [XmlArrayItem(typeof(Data))] [XmlArrayItem(typeof(ComplexData))] public object[] EventData; } public class Data { [XmlAttribute] public string Name { get; set; } [XmlText] public string Value { get; set; } } public class ComplexData { [XmlAttribute] public string Name { get; set; } [XmlText(DataType = "hexBinary")] public byte[] Encoded { get; set; } } 

请阅读文档:

  • 引入XML序列化
  • 使用属性控制XML序列化
  • XML序列化的例子