Удаленный запуск Get-EventLog стирает фактический журнал событий

Я написал сценарий для удаленного получения журналов событий в PowerShell, но мне не нравится, как этот сценарий создает собственные записи в журнале событий.

В частности, этот сценарий захватывает несколько типов идентификаторов событий, включая события входа/выхода из системы. Недавно меня попросили запустить скрипт для получения событий для другого пользователя, и мне пришлось получить эти данные за несколько часов. Обычно я запускаю скрипт и позволяю ему работать большую часть дня (потому что здесь обычно МНОГО данных), но на этот раз, чтобы ускорить процесс, я запустил 4 экземпляра скрипта, чтобы получить эти данные быстрее, чем обычный. Каждый экземпляр сценария просматривал разные временные рамки, так что все 4 объединенных сценария загружались в те временные рамки, о которых меня просили.

В течение 3 часов или около того у меня было более миллиона различных попыток входа в систему для моего идентификатора пользователя на этом удаленном компьютере. У меня было так много входов в систему, что в итоге я перезаписал данные журнала событий, которые меня изначально просили получить.

Извлеченные уроки, теперь я изучаю, как сделать это быстрее, эффективнее и надежнее.

Вот сердцевина моего кода, довольно простая и простая, и по большей части работает.

$output = Get-EventLog `
    -instanceID 4672,4647,4634,4624,4625,4648,4675,4800,4801,4802,4803 `
    -logName Security `
    -after (Get-Date $inStartDate) `
    -before (Get-Date $inEndDate).addDays(1) `
    -message ("*" + $InUserID + "*") `
    -computerName $inPCID

Я предполагаю, что есть несколько вопросов, которые я до сих пор не смог выяснить в своем исследовании. Зачем Get-EventLog нужно устанавливать так много подключений? Это из-за того, что соединение постоянно обрывалось или что-то в этом роде?

Каким будет самый быстрый способ получить эти данные - использовать собственную команду Get-EventLog, указав -ComputerName, или я должен использовать что-то вроде Enter-PSSession или Invoke-Command.

Будут ли у Enter-PSSession и Invoke-Command те же проблемы, что и у меня с Get-EventLog?

Я бы не хотел использовать Enter-PSSession и Invoke-Command по той простой причине, что я не могу гарантировать, что на всех машинах в компании будет включено удаленное выполнение.


person Boeckm    schedule 02.05.2012    source источник
comment
Чем отличается использование Get-WinEvent — новой более мощной замены Get-Event?   -  person Richard    schedule 02.05.2012
comment
@ Ричард, вау, на самом деле похоже, что Get-WinEvent работает просто отлично. Я даже не осознавал, что Get-Event устарел, пока вы что-то не сказали. Мой скрипт долгое время работал нормально, и вдруг мы заметили, что с ним что-то не так. Похоже, теперь он работает нормально! Будет продолжать тестирование.   -  person Boeckm    schedule 04.05.2012


Ответы (1)


Итак, проблема заключалась в том, что Get-EventLog в конечном итоге стирал удаленные журналы событий, которые я пытался получить. Не знаю почему, но Get-EventLog сделал более миллиона "подключений", которые отображались как события входа/выхода из системы, таким образом перезаписывая мои журналы.

Согласно комментарию @Richard, я провел небольшое исследование и решил протестировать Get-WinEvent, обновленную и более мощную замену Get-EventLog. После тестирования с этим в течение недели худший сценарий, с которым я столкнулся, заключался в том, что мой сценарий создавал 4 события входа в систему/выхода из системы. Это вполне приемлемо и намного приятнее, чем более миллиона событий.

Побочный вопрос, который у меня был связан с этой темой, касался производительности. Поскольку мы собираем много удаленных журналов, иногда нам нужно сделать это как можно быстрее. Мой вопрос заключается в том, будет ли Get-WinEvent достаточно быстрым для извлечения журналов по сравнению с Enter-PSSession или Invoke-Command.

Что касается объема этого вопроса, Get-WinEvent удовлетворил как требования к скорости, так и требования к событиям, и использование командлета для выполнения моего удаленного взаимодействия отлично сработало.

Мой код довольно прост, но я опубликую его по причинам записи:

Get-WinEvent `
    -computerName $inPCID `
    -FilterHashtable @{LogName="Security";Id=4672,4647,4634,4624,4625,4648,4675,4800,4801,4802,4803; `
                       StartTime = $inStartDate; EndTime = $inEndDate} | Where-object {$_.message -like ("*" + $InUserID + "*")} `
    | export-csv $fullOutputFile
person Boeckm    schedule 09.05.2012