Экспорт определенных журналов событий безопасности Windows

Мне нужна помощь в завершении сценария PowerShell, в котором я могу получить определенные журналы событий безопасности и экспортировать их в файл CSV. В настоящее время у меня есть эта линия,

Get-EventLog -LogName Security 4720,4722,4725 -After ((Get-Date).AddDays(-1)) | Export-CSV "C:\EventLogs.csv"

Это получает события безопасности, которые я хочу получить. Однако информация, которую он предоставляет, является неполной. Он не включает эти 2 в вывод,

  1. Имя учетной записи — учетная запись, которая сделала изменение
  2. Целевая учетная запись — учетная запись, которая была изменена

Есть ли способ включить эти 2 выше?

Мне сказали, что Get-WinEvent лучше подходит для этого, но я новичок в написании сценариев PowerShell, поэтому я был бы очень признателен за небольшую помощь. Спасибо


person lapsantos    schedule 06.04.2016    source источник


Ответы (1)


Как правило, Export-Csv будет:

  • посмотрите на 1-й входной объект
  • проверьте его тип и определите столбцы для экспорта на основе всех свойств этого типа.

Однако в вашем случае похоже, что интересующая информация может содержаться внутри свойства Message типа.

Таким образом, вы должны использовать промежуточный вызов Select-Object с тщательно созданной хеш-таблицей, чтобы извлечь интересующую информацию в виде отдельных свойств, которые затем будет экспортировать Export-Csv:

Вот пример, который извлекает имена учетных записей из свойства Message и экспортирует их как отдельные столбцы:

Get-EventLog -LogName Security 4720,4722,4725 -After ((Get-Date).AddDays(-1)) |
 Select-Object EventId, Time, @{ 
   n='AccountName';
   e={ ($_.message -replace '\n', ' ') -replace '.*?account name:\t+([^\s]+).*', '$1' } 
 }, @{
   n='TargetAccount';
   e={ ($_.message -replace '\n', ' ') -replace '.*account name:\t+([^\s]+).*', '$1' } 
 } | Export-Csv 'C:\EventLogs.csv'

Обратите внимание, что первое регулярное выражение, переданное -replace, является нежадным (.*?), что означает, что первое вхождение будет соответствовать, тогда как второе является жадным (просто .*) , что означает, что будет найдено последнее вхождение.

Дополнительный шаг по замене разрывов строк пробелами необходим, потому что -replace, по-видимому, всегда соответствует строке за строкой.

person mklement0    schedule 06.04.2016
comment
Привет. Я проверил ваш скрипт, и он работал как шарм! Однако единственная запись, которую я получаю, — это Target AccoutName. Можете ли вы указать имя учетной записи источника/субъекта и время, когда произошло событие? Я очень ценю вашу помощь! - person lapsantos; 06.04.2016
comment
@lapsantos: пожалуйста, смотрите мое обновление; это не самый надежный способ анализа поля Message, но в вашем случае он может подойти. Обратите внимание, что при необходимости вы можете добавить дополнительные стандартные поля, такие как Source, просто добавив их в список, разделенный запятыми, переданный в Select-Object (т. е. добавив в массив имен свойств). - person mklement0; 06.04.2016