Разбирать wevtutil XML в базу данных?

Я ни в коем случае не эксперт по XML. Поэтому у меня проблемы с импортом XML-файла событий Windows из 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>

Есть ли относительно простой способ импортировать этот материал в базу данных, сопоставляя с [Field3] и так далее? Я в порядке с написанием VB-скрипта (или чего-то еще), чтобы анализировать данные по одной строке за раз и вставлять их в базу данных по одной строке за раз, если мне действительно нужно заново изобрести колесо. Однако я бы предпочел стоять на плечах гигантов. Любые предложения, кроме, чтобы проверить мой вопрос на смешанные метафоры?

(примечание: это будет повторяющийся процесс, поэтому он не требует инструментов только для графического интерфейса).

1 ответ

Решение

Я делаю именно это в сценарии с помощью PowerShell. Весь сценарий загрузки в базу данных составляет около 18 КБ, поэтому я не собираюсь публиковать здесь все это (хотя у меня есть общие идеи здесь). Обработка 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

Переменные в этом должны быть понятны. Я отслеживаю события входа в систему, выхода из системы и блокировки. Генерация "NowFilterString" в смешном формате wevtutil требует:

$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.

Другие вопросы по тегам