Всем привет.
Продолжим вычитывать события с помощью 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) <= 86400000]]]</Select>
</Query>
</QueryList>
"@
Get-WinEvent –FilterXml $filterXml
В фильтре filterXml можно указать диапазон так:
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[(Level=1 ) and ( (EventID >= 4620 and EventID <= 4660) ) and TimeCreated[timediff(@SystemTime) <= 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
}
Продолжим вычитывать события с помощью 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) <= 86400000]]]</Select>
</Query>
</QueryList>
"@
Get-WinEvent –FilterXml $filterXml
В фильтре filterXml можно указать диапазон так:
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[(Level=1 ) and ( (EventID >= 4620 and EventID <= 4660) ) and TimeCreated[timediff(@SystemTime) <= 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
}
Успехов.
Looking for ID 4740,4771 Security in CD and ID 4625 Security in local host.
ReplyDeleteID=4741 Создание компьютера в домене
ReplyDeleteID=4743 Удаление компьютера из домена
ID=4728 Добавление в группу безопасности
ID=4729 Удаление из группы безопасности
ID=4720 Создание пользователя
ID=4726 Удаление пользователя
ID=4740 Блокировка учетной записи
ID=4767 Разблокировка учетной записи
ID=4722 Включение учетной записи
ID=4725 Отключение учетной записи