如何通过Powershell收集单个类别的安全事件日志

我正在尝试编写一个脚本,它每小时从我们的所有域控制器收集安全日志并远程存储它们; 我可以收集安全日志,但有没有办法从DC收集类别或事件编号的安全日志? 如果有任何其他问题,请让我知道。

我的代码:

$Eventlogs = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $computer Foreach($log in $EventLogs) { if($Log.LogFileName -eq "Security") { $Now = [DateTime]::Now $FileName = "Security" +"_"+$Now.Month+$Now.Day+$Now.Year+"_"+$Now.Hour+$Now.Minute+$Now.Second $path = "\\{0}\c$\LogFolder\$folder\$FileName.evt" -f $Computer $ErrBackup = ($log.BackupEventLog($path)).ReturnValue if($clear) { if($ErrBackup -ne 0) { "Backup failed" "Backup Error was " + $ErrBackup } } } } Copy-EventLogsToArchive -path $path -Folder $Folder } 

Get-EventLog没有得到任务类别,只是它不是Cmdlet的默认行为。 但数据仍然存在。

 Import-Module ActiveDirectory foreach($server in Get-ADComputer -Filter *) { Get-EventLog -LogName Security -ComputerName $server | ? { $_.CategoryNumber -EQ 12544 } } 

由于任务类别实际上是数字格式,事实进一步复杂化 – 事件查看器使用CategoryMessageFiles将类别号码转换为类别名称。

您可以在HKLM\System\CurrentControlSet\services\eventlog\Security\Securityfindregistry中CategoryMessageFiles的位置(每个事件日志都有一个子项)。

这样做的原因是为了方便开发人员为自己的应用程序创build自己的事件日志和自己的任务类别。

这里有一些关于如何获取CategoryMessagestring的开发者文档 , 但是我知道你不想要经历所有这些,所以下一个最好的事情就是find你想要过滤的事件的例子,弄清楚他们的类别号码,然后做一个Switch($_.CategoryNumber)在他们把它们翻译成你喜欢的任何string。

编辑:其实是从头开始。 忽略我刚才所说的一切。 这应该更好地为您服务:

 Get-WMIObject -Query "SELECT * FROM Win32_NTLogEvent WHERE LogFile='Security'" | Select EventCode, CategoryString 

对不起,打破这个给你,但你不能做到这一点(从Windows Server 2003的命令行中备份过滤事件日志文件到新的事件日志文件)。

您可以将事件日志中的一部分事件导出为XML或CSV文件。

您可以使用Get-EventLog并使用Where-Object筛选任务类别中的所有事件。 Ryan已经指出,尽pipe任务类别不是默认输出的一部分,但它仍然存在

以下示例适用于Windows Server 2003(包括R2),并返回类别“login/注销”和“对象访问”中的所有安全日志事件

 Get-EventLog -LogName Security | Where-Object {@("Logon/Logoff","Object Access") -contains $_.Category} 

这很容易读取和维护,但是不能很好地执行,因为在过滤之前,PowerShell会获取并序列化所有事件日志条目。

基于Ryans的例子,我们使用WQLfilter来实现它:

 $events = Get-WMIObject -Query "SELECT * FROM Win32_NTLogEvent WHERE LogFile='Security' AND (CategoryString = 'Logon/Logoff' OR CategoryString = 'Object Access')" 

要将过滤的事件保存到文件,您可以将它们导出为CSV文件中的行:

 $events | Export-Csv C:\myEvents.csv -NoTypeInformation 

或者(如果您没有任何问题压缩备份但希望保留消息格式)使用Export-CliXML cmdlet将其输出到XML:

 $events | Export-CliXML C:\myEvents.xml 

然后,您可以在将来需要search它们时将它们导入命令行:

 $events = Import-CliXML C:\myEvents.xml 

XML输出是序列化的并且需要大量的存储空间,但是由于安全日志事件大部分是用空白字符填充的,所以通过压缩文件很容易回收磁盘空间。 我从一个XML文件中获得一个普通的压缩文件夹大约98%的压缩率, 200.000个安全事件。

使用7-zip可能可以实现更好的压缩