Назад | Перейти на главную страницу

Как собрать журналы событий безопасности для одной категории с помощью 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 не получает категорию задач, просто это не поведение командлета по умолчанию для ее отображения. Но данные все еще есть.

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

Извините, что нарушил это, но вы не можете этого сделать (создать резервную копию файла журнала с фильтрами в новый файл журнала событий) из командной строки в Windows Server 2003.

Вы можете экспортировать подмножество событий из журнала событий в файл XML или CSV.

Вы можете использовать Get-EventLog и отфильтруйте все события по категории задач с помощью Where-Object. Как уже отмечал Райан, хотя категория задач не является частью вывода по умолчанию, она все еще существует.

Следующий пример только работает на Windows Server 2003 (включая R2) и возвращает все события журнала безопасности в категориях «Вход / выход» и «Доступ к объектам»

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

Это легко читать и поддерживать, но работает не очень хорошо, поскольку PowerShell извлекает и сериализует ВСЕ записи журнала событий перед фильтрацией.

Основываясь на примере Райана, давайте вместо этого воспользуемся 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, чтобы вывести его в XML:

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

Затем вы можете импортировать их в командную строку, когда вам понадобится искать их в будущем:

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

Выходные данные XML сериализованы и требуют много места для хранения, но поскольку события журнала безопасности в основном заполнены пробелами, дисковое пространство легко освободить, заархивировав файлы. Я получаю степень сжатия около 98% с обычной zip-папкой из XML-файла, содержащего прибл. 200000 событий безопасности.

Возможно, вы сможете добиться еще лучшего сжатия с помощью 7-молния