将wevtutil XMLparsing为数据库?

我绝不是一个XML专家。 Ergo,我无法从wevtutil将Windows事件XML导入到SQL数据库中。 在Server 2008之前,我们使用Log Parser 2.2直接将事件日志数据导出到数据库,但是logparser尚未升级以正常处理Server 2008事件日志。

这是我知道如何处理:

<Field1>text</Field1> <Field2>text</Field2> <Field3>text</Field3> <Field4>text</Field4> 

以下是wevtutil在将事件日志导出到XML时创build的有些不同的格式:

 <Field1>text</Field1> <Field2>text</Field2> <EventData> <Data Name='Field3'>text</Data> <Data Name='Field4'>text</Data> </EventData> 

有没有一种相对直接的方式将这些东西导入到数据库中,将<Data Name ='Field3'>映射到[Field3]等等? 如果我真的需要重新发明轮子,我可以编写一个VB脚本(或其他)来一次parsing一行数据,并一次插入数据库。 不过,我宁愿站在巨人的肩膀上。 任何build议,而不是检查我的问题混合隐喻?

(注意:这将是一个重复的过程,所以它不能要求使用GUI的工具。)

我正在通过PowerShell的方式在脚本中执行此操作。 整个上传到数据库的脚本大约是18K,所以我不打算在这里重新发布整个事情(虽然我有这里的一般想法)。 处理XML非常简单。

获取事件数据的命令是你已经知道的。

wevtutil qe Security /r:$DC /q:"*[System[((EventID=$LogonID or EventID=$FLogonID or EventID=$LogoffID or EventID=$LockoutID) and TimeCreated[@SystemTime > '$LUFilterString'] and TimeCreated[@SystemTime < '$NowFilterString'] )]] " > $DC-events.xml

这个variables应该是清楚的。 我正在跟踪login,注销和locking事件。 以滑稽的格式生成“NowFilterString”wevtutil要求:

 $Now=get-date $Msec=$now.Millisecond $NowFilterString=$Now.AddSeconds(-1).AddMilliseconds(-$Msec).ToUniversalTime().ToString("O") 

为了更好地处理边界情况,我将截短的毫秒数降为零。

所以现在你有一个XML文件。 怎么办? parsing该XML文件:

 get-content ".\$DC-events.xml" | foreach { $Event=[xml]$_ $DateTime=[datetime]$Event.event.System.TimeCreated.GetAttribute("SystemTime") codecodecodecode } 

访问个别元素是由:

 foreach ($Data in $Event.event.EventData.get_childNodes()) { if ($Data.Name -eq "TargetUserName") { $User=$Data."#text"} elseif ($Data.Name -eq "IpAddress") {$IP=$Data."#text"} } 

或者另一个例子

 foreach ($Data in $Event.event.EventData.get_childNodes()) { if ($Data.Name -eq "TargetUserName") {$User=$Data."#text"} elseif ($Data.Name -eq "WorkstationName") {$MachineName=$Data."#text"} elseif ($Data.Name -eq "IpAddress") {$IP=$Data."#text"} # Ensure only failed logins to the right domain are processed: elseif ($Data.Name -eq "TargetDomainName") {$Domain=$Data."#text"} } 

我希望这可以帮助你找出XMLparsing。 由于这是PowerShell,其中大部分都可以很容易地转换为标准的.NET调用。