Windows-Server-2008

將 wevtutil XML 解析到數據庫中?

  • January 28, 2011

我絕不是 XML 專家。因此,我在將 Windows 事件 XML 從 wevtutil 導入 SQL 數據庫時遇到問題。在 Server 2008 之前,我們使用 Log Parser 2.2 直接將事件日誌數據導出到數據庫中,但 logparser 尚未升級為優雅地處理 Server 2008 事件日誌。

這是我知道如何處理的:

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

這是 wevtutil 在將事件日誌導出到 XML 時創建的稍微不同的格式:

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

有沒有一種相對簡單的方法可以將這些東西導入數據庫,將 <Data Name=‘Field3’> 映射到

$$ Field3 $$等等?如果我真的需要重新發明輪子,我可以編寫一個 VB 腳本(或其他腳本)來一次解析一行數據並將其一次一行插入數據庫中。但是,我更願意站在巨人的肩膀上。除了檢查我的問題是否有混合隱喻之外,還有什麼建議嗎? (注意:這將是一個重複的過程,因此它不需要僅 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 &gt; '$LUFilterString'] and TimeCreated[@SystemTime &lt; '$NowFilterString'] )]] " &gt; $DC-events.xml

其中的變數應該很清楚。我正在跟踪登錄、註銷和鎖定事件。以有趣的格式 wevtutil 生成“NowFilterString”需要:

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

我將毫秒截斷為零以更好地處理邊緣情況。

所以現在你有了一個 XML 文件。怎麼辦?要解析該 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"}
   }

我希望這可以幫助您弄清楚 XML 解析。由於這是 PowerShell,因此其中大部分都可以輕鬆轉換為標準 .NET 呼叫。

引用自:https://serverfault.com/questions/154089