Как можно сохранять данные определенных событий журнала Windows в файле в режиме реального времени?
Добрый день, стоит задача на контроллере домена сделать некий сервис/службу или что то подобное, которые
будет в режиме реального времени ожидать определенные события (под определенными ID) и информацию по ним
сохраняться в ежедневный наполняемый CSV файл.
А именно например кто то создал нового пользователя, нужно в файл записать кто, когда и как назвал.
Аналогично потом нужно будет добавлять другие событие, например изменил аттрибуты пользователя, его членство, изменил или создал OU, назначил политику и т.д.
Т.е. примерно то что, делает тот же Netwrix.
В будущем в идеале планируется это логирование вести не в файлы, а в базу данных
я правильно понимаю, что подобным примером я могу воспользоваться и в powershell-е, а также его зациклить чтобы он жил всё время в ожидании определенных событий, и когда таковые появляются логировать их будь то в файлы или в базу
MaxKozlov , извиняюсь на дилетантский вопрос, не так сильно ещё силен в PS, правильно понимаю, что
# здесь объявили новый объект типа массив
$global:log = New-Object System.Collections.ArrayList
# здесь создаём объект который будет слушать события системы
$testobj = New-Object -TypeName System.Diagnostics.EventLog
# слушать из раздела Security
$testobj.Log = "Security"
# а здесь как раз происходит подписка но возникающие события
Register-ObjectEvent -InputObject $testobj -EventName EntryWritten -Action {
# и в случае их появления то происходит выполнение следующего
param($sender, $e)
[void]$global:log.Add([PSCustomObject]@{Sender = $sender; Args = $e })
}
# Смотреть потом события в переменной
$global:log
Вы писали что не обязательно циклить, достаточно оставить окно открытым, но если я выполню данный скрипт, он ведь успешно выполнится, и более не будет ничего ожидать
MaxKozlov, только сейчас начал ваш вариант тестировать =)
скажите пожалуйста: param($sender, $e) - sender и e так понимаю это некий контекст получаемый от отрабатываемого события. Как то можно узнать, общий перечень получаемых данных (некий перечень всех переменных и их значений),
например я хочу на ходу проверить ID события и на основе его номера делать те или иные действия
и соответственно также далее вытаскивать определенные переменные
Я так понимаю вы имеете ввиду через Get-EventLog ?
Заметил, что он выдаёт скажем так общую информацию, нельзя выделить отдельно автора изменений, кого меняли и т.п.
Всё там есть, только каждая Message зависит от типа события.
А сами данные хранятся в ReplacementStrings
Вот только недавно рассказывал как до них добраться https://qna.habr.com/answer?answer_id=2161572
long_skinny_boy,
MS официально рекомендует: "Get-EventLog uses a Win32 API that is deprecated. The results may not be accurate. Use the Get-WinEvent cmdlet instead." Get-WinEvent - работает быстрее, возвращает больше информации Get-EventLog - из плюсов: есть параметры -Before и -After, можно ограничивать выборку по датам
Никто не запрещает использовать оба командлета...
Get-WinEvent тоже может по датам. только там для этого надо извращаться с параметрами -Filter* что для тех, кто хочет быстро, представляет сложность.
Но работает тормознее, заметно тормознее, особенно для удалённых подключений. По крайней мере первое подключение.
Роман Безруков, Тут, наверное, может быть связано с типом логов. нагруженный Security у меня в несколько раз быстрее получается забрать через Get-EventLog -ComputerName $c, следом идёт Invoke-Command -ComputerName $c { Get-WinEvent }, а уже потом Get-WinEvent -ComputerName $c
По-видимому, это связано с форматированием сообщений. Языки на сервере и клиенте разные