Como coletar logs de eventos de segurança para uma única categoria via Powershell

2

Estou tentando escrever um script que coleta o log de segurança de todos os nossos controladores de domínio por hora e os armazena remotamente; Eu posso coletar os logs de segurança, mas existe uma maneira de coletar os logs de segurança por categoria ou número de evento do DC? por favor, deixe-me saber se alguma dúvida adicional.

Meu código:

$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 
} 
    
por Darktux 21.10.2013 / 18:39

2 respostas

6

Não é que Get-EventLog não receba a Categoria de Tarefa, é apenas que não é o comportamento padrão do Cmdlet para exibi-la. Mas os dados ainda estão lá.

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

Isso é ainda mais complicado pelo fato de que as Categorias de Tarefas estão, na verdade, em formato numérico - O Visualizador de Eventos usa CategoryMessageFiles para traduzir os números de categoria em nomes de categoria.

Você pode encontrar o local dos CategoryMessageFiles no registro, em HKLM\System\CurrentControlSet\services\eventlog\Security\Security (há uma subchave para cada log de eventos.)

O motivo pelo qual isso é feito é facilitar para os desenvolvedores criar seus próprios logs de eventos e suas próprias categorias de tarefas para seus próprios aplicativos.

Aqui está uma documentação do desenvolvedor sobre como obter strings CategoryMessage , mas eu sei você não quer passar por tudo isso, então a próxima melhor coisa seria encontrar exemplos do tipo de evento que você deseja filtrar, descobrir seus números de categoria e, em seguida, fazer um Switch($_.CategoryNumber) para eles traduza-os para o que você quiser.

Editar: Na verdade, risque tudo isso. Ignore tudo o que acabei de dizer. Isso deve servir muito melhor para você:

Get-WMIObject -Query "SELECT * FROM Win32_NTLogEvent WHERE LogFile='Security'" | Select EventCode, CategoryString
    
por 21.10.2013 / 20:47
0

Desculpe interromper isso, mas você não pode fazer isso (fazer backup de um arquivo de log de eventos filtrado para um novo arquivo de log de eventos) na linha de comando do Windows Server 2003.

Você pode exportar um subconjunto dos eventos em um log de eventos para um arquivo XML ou CSV.

Você pode usar o Get-EventLog e filtrar todos os eventos na categoria de tarefas com < href="http://technet.microsoft.com/pt-br/library/hh849715(v=wps.620).aspx"> Where-Object . Como Ryan já apontou, embora a categoria da tarefa não faça parte da saída padrão, ela ainda está lá

O seguinte exemplo somente funciona no Windows Server 2003 (R2 incluso) e retorna todos os eventos do Log de Segurança nas categorias "Login / Logoff" e "Acesso ao Objeto"

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

Isso é fácil de ler e manter, mas não funciona muito bem, já que o PowerShell busca e serializa TODAS as entradas do log de eventos, antes de filtrar.

Com base no exemplo do Ryans, vamos usar um filtro WQL para realizá-lo:

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

Para salvar os eventos filtrados no arquivo, você pode exportá-los como linhas em um arquivo CSV:

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

ou (se você não tiver problema para compactar o backup, mas quiser manter o formato da mensagem) use o cmdlet Export-CliXML para gerá-lo em XML:

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

Você pode importá-los para a linha de comando quando precisar pesquisá-los no futuro:

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

A saída XML é serializada e requer muito armazenamento, mas como os eventos do log de segurança são geralmente preenchidos com caracteres de espaço em branco, o espaço em disco é facilmente recuperado ao compactar os arquivos. Eu recebo uma taxa de compressão de cerca de 98% com uma pasta zip comum de um arquivo XML contendo aprox. 200.000 eventos de segurança.

Você pode conseguir uma compactação ainda melhor com 7-zip

    
por 21.10.2013 / 22:02