Я делаю точно это в сценарии посредством 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
Переменные в этом должны быть ясными. Я отслеживаю вход в систему, выход из системы и события локаута. При генерации "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.