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

如何通过 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 
} 

答案1

这并不是说 Get-EventLog 没有获取任务类别,只是显示它不是 Cmdlet 的默认行为。但数据仍​​然存在。

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

由于任务类别实际上是数字格式,因此情况变得更加复杂 - 事件查看器使用 CategoryMessageFiles 将类别编号转换为类别名称。

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

这样做的原因是为了让开发人员可以轻松地为自己的应用程序创建自己的事件日志和自己的任务类别。

以下是一些开发人员文档关于如何获取 CategoryMessage 字符串,但我知道您不想经历所有这些,因此下一个最好的办法就是找到您想要过滤的事件类型的示例,找出它们的类别编号,然后对Switch($_.CategoryNumber)它们进行处理以将它们转换成您喜欢的任何字符串。

编辑: 其实,把这些都删掉。忽略我刚才说的一切。这应该对你更有用:

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

答案2

很抱歉告诉您这个情况,但您无法从 Windows Server 2003 中的命令行执行此操作(将过滤的事件日志文件备份到新的事件日志文件)。

您可以将事件日志中的事件子集导出为 XML 或 CSV 文件。

您可以使用Get-EventLog并使用以下方式过滤任务类别上的所有事件Where-Object。正如 Ryan 已经指出的那样,尽管任务类别不是默认输出的一部分,但它仍然存在

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

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

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

基于 Ryans 的示例,让我们使用 WQL 过滤器来完成它:

$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

然后,当您将来需要搜索它们时,您可以将它们导入到命令行:

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

XML 输出是序列化的,需要大量存储空间,但由于安全日志事件大多由空格字符填充,因此可以通过压缩文件轻松回收磁盘空间。我使用普通 zip 文件夹对包含约 200,000 个安全事件的 XML 文件进行了压缩,压缩率约为 98%。

您可能能够使用以下方法实现更好的压缩7-zip

相关内容