导出特定的Windows安全事件日志

时间:2016-04-06 00:39:08

标签: powershell event-log

我需要有关完成PowerShell脚本的帮助,在该脚本中我可以获取特定的安全事件日志并将其导出到CSV文件。目前,我有这条线,

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

这确实可以获得我想要的安全事件。但是,它提供的信息不完整。它不包括输出中的这两个

  1. 帐户名称 - 执行更改的帐户
  2. 目标帐户 - 已更改的帐户
  3. 有没有办法在上面加上这两个?

    我被告知Get-WinEvent更适合这样做,但我对PowerShell脚本编写起来相当新,所以我真的很感激一点帮助。谢谢

1 个答案:

答案 0 :(得分:2)

通常,Export-Csv会:

  • 查看 1st 输入对象
  • 检查其类型并根据类型具有的所有属性确定要导出的列。

但是,在您的情况下,听起来感兴趣的信息可能包含 类型的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的第一个正则表达式是非贪婪.*?),这意味着第一个匹配项将匹配,而第二个是贪婪的(只是.*),这意味着 last 出现将匹配。

用空格替换换行符的额外步骤是必要的,因为-replace显然总是逐行匹配。