Главная

Thursday, 21 June 2018

Запрос Get-WinEvent и его параметры.

Всем привет.

Продолжим вычитывать события с помощью Get-WinEvent. У одного админа была задача сформировать запрос Get-WinEvent в котором более 25 условий. Такие вот задачки ставят администратору. Почему 25, а не 125?  Не знаю. Жизнь штука сложная.

Ближе к делу. Для формирования запросов в  Get-WinEvent мы можем использовать 3 параметра:
-FilterXPath <String>
-FilterXml <XmlDocument>
-FilterHashtable <Hashtable[]>

Подробную справку по параметрам у Get-WinEvent найдете здесь.

Я просто поганял все три параметра для самых популярных, на мой взгляд, кодов событий:
4720 : A user account was created.
4722 : A user account was enabled.
4723 : An attempt was made to change an account’s password.
4724 : An attempt was made to reset an account’s password.
4725 : A user account was disabled.
4726 : A user account was deleted.

1) FilterHashtable.
Первый вариант использует период времени в сутки и сам код события $IDEvent.
Если нужен диапазон то $IDEvent = (4720..4726), если  несколько то $IDEvent = (4720,4722,4725) соответственно.

$time = (get-date) - (new-timespan -hour 24)
$QEvent = 0
$IDEvent = 4720

"Time  | ADGroup | NewUser | AdminUser | ID:"+ $IDEvent
Get-WinEvent -FilterHashtable @{LogName="Security";ID=$IDEvent;StartTime=$Time}| Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$QEvent = $QEvent +1;

$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$NewUser = $event.Event.EventData.Data[0]."#text"
$ADGroup = $event.Event.EventData.Data[2]."#text"
$AdminUser = $event.Event.EventData.Data[6]."#text"
$dc = $event.Event.System.computer
$Time + " | " + $ADGroup + " | " + $NewUser + " | " + $AdminUser
 }
}
"Count: "+$QEvent



Тот же запрос можно завернуть на определенный контроллер домена.

(Get-ADComputer -SearchBase ‘OU=Domain Controllers,DC=forza,DC=local’ -Filter *).Name | foreach {
Get-WinEvent -ComputerName $_ -FilterHashtable @{LogName="Security";ID=4724 }| Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$AdmUser = $event.Event.EventData.Data[4]."#text"
$User = $event.Event.EventData.Data[0]."#text"
$dc = $event.Event.System.computer
write-host “Admin ” $AdmUser “ reset password to ” $User “ on ” $dc “ “ $Time
  }
 }
}


2) filterXPath.
Второй вариант использует явное указание кодов.
Можно облагородить запрос, но я так не делал.

$id = (4798..4799 | Foreach {"EventID=$_"}) -join " or "
$query = "*[System[$id]]"
Get-WinEvent -LogName Security –FilterXPath $query

3) filterXml.
Третий вариант использует явное указание кодов событий и периода времени в секундах (сутки).

$filterXml = @"
<QueryList>
  <Query Id="0" Path="Security">
    <Select Path="Security">*[System[(EventID=4722 or EventID=4725) and TimeCreated[timediff(@SystemTime) &lt;= 86400000]]]</Select>
  </Query>
</QueryList>
"@
Get-WinEvent –FilterXml $filterXml

В фильтре filterXml можно указать диапазон так:
<QueryList>
  <Query Id="0" Path="Security">
    <Select Path="Security">*[System[(Level=1 ) and ( (EventID &gt;= 4620 and EventID &lt;= 4660) ) and TimeCreated[timediff(@SystemTime) &lt;= 3600000]]]</Select>
  </Query>
</QueryList>

Название полей регистрозависимо, на EventId выдаст ошибку. Поэтому правильный вариант EventID. Опыт показал что FilterHashtable и FilterXpath не поддерживают более 23 выражений в одном запросе, как и несколько запросов разом. А вот filterXml включает и много условий и несколько источников. Выбор параметра для работы очевиден. Можно строить первую корреляцию событий.

$id1 = (4780..4788 | Foreach {"EventID=$_"}) -join " or "
$id2 = (4798..4799 | Foreach {"EventID=$_"}) -join " or "
$id3 = (1000..1003 | Foreach {"EventID=$_"}) -join " or "
$id4 = (6041..6055 | Foreach {"EventID=$_"}) -join " or "
$filterXml = @"
<QueryList>
  <Query Id="0" Path="Security">
    <Select Path="Security"*[System[$id1]]</Select>
    <Select Path="Security"*[System[$id2]]</Select>
    <Select Path="Application"*[System[$id3]]</Select>
    <Select Path="System"*[System[$id4]]</Select>
  </Query>
</QueryList>
"@
Get-WinEvent –FilterXml $filterXml -MaxEvent 1

Какой инструмент использовать для формирования XML запросов? Очень удобный инструмент для тестирования и формирования запросов это встроенное средство Event Viewer, вкладка "XML". Загляните туда, текст фильтра там.


Если при использовании Get-WiEvent в ОC отличных от английского языка поле Message у событий пустое то вам следует использовать
функцию Using-Culture. Помните такую?
Using-Culture en-us {
    Get-WinEvent -FilterXml $xml -MaxEvent 1
}

Успехов.

2 comments:

  1. Looking for ID 4740,4771 Security in CD and ID 4625 Security in local host.

    ReplyDelete
  2. ID=4741 Создание компьютера в домене
    ID=4743 Удаление компьютера из домена
    ID=4728 Добавление в группу безопасности
    ID=4729 Удаление из группы безопасности
    ID=4720 Создание пользователя
    ID=4726 Удаление пользователя
    ID=4740 Блокировка учетной записи
    ID=4767 Разблокировка учетной записи
    ID=4722 Включение учетной записи
    ID=4725 Отключение учетной записи

    ReplyDelete

А что вы думаете по этому поводу?