将 wevtutil XML 解析到数据库中?

将 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 的工具。)

答案1

我正在通过 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 调用。

相关内容