Я ни в коем случае не эксперт по XML. Ergo, у меня проблемы с импортом 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>
Есть ли относительно простой способ импортировать этот материал в базу данных, сопоставив <Data Name = 'Field3'> с [Field3] и так далее? Я согласен с написанием сценария VB (или чего-то еще) для анализа данных по одной строке за раз и вставки их в базу данных по одной строке за раз, если мне действительно нужно изобретать колесо. Однако я бы предпочел встать на плечи гигантов. Есть ли предложения, кроме проверки моего вопроса на смешанные метафоры?
(примечание: это будет повторяющийся процесс, поэтому для него не могут потребоваться инструменты только с графическим интерфейсом.)
Я делаю именно это в скрипте посредством 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.