將 wevtutil XML 解析到數據庫中?
我絕不是 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 > '$LUFilterString'] and TimeCreated[@SystemTime < '$NowFilterString'] )]] " > $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 呼叫。