Um Guia Completo para Utilizar o Cmdlet Get-WinEvent no PowerShell

O Windows possui vários registros de eventos diferentes, mas como você faz para recuperá-los rapidamente? O cmdlet Get-WinEvent pode recuperar registros de eventos clássicos do Windows, como os registros do Sistema e de Aplicativos, logs gerados pela tecnologia Windows Event Log e até mesmo logs do Event Tracing for Windows (ETW)!

Neste artigo, aprenda como aproveitar o Get-WinEvent para recuperar e filtrar eventos de registros de eventos!

Pré-requisitos

Para acompanhar, você só precisa de uma versão atual do Windows 10 e do PowerShell 5.1 ou superior. Este artigo está usando o Windows 10 e o PowerShell 7.1.

Listando Registros Disponíveis com Get-WinEvent

É difícil saber quais entradas de log você pode precisar sem conhecer todos os registros disponíveis. Com o Get-WinEvent, você pode listar todos os registros disponíveis rapidamente usando o parâmetro -ListLog. O valor do parâmetro * indica ao Get-WinEvent para listar todos os registros sem filtragem. Como mostrado abaixo, todos os registros são recuperados, mas apenas um conjunto limitado de propriedades é exibido usando o Select-Object cmdlet.

Get-WinEvent -ListLog * | Select-Object LogName, RecordCount, IsClassicLog, IsEnabled, LogMode, LogType | Format-Table -AutoSize

Nem todos os registros são habilitados por padrão. Talvez seja necessário abrir o Visualizador de Eventos, localizar o registro e clicar com o botão direito para Habilitar o registro antes que os eventos apareçam.

Listing all available event logs.

Todos os logs pós-Windows Vista são salvos como arquivos *.evtx em vez do formato mais antigo *.evt. A propriedade IsClassicLog indica se os eventos do log estão definidos em um Arquivo de Mensagens, formato *.mc, ou em um manifesto, formato *.xml.

Uma propriedade interessante é o LogMode, que você pode ter notado que geralmente é definido como Circular.

  • Circular – Sobrescreve a entrada de log mais antiga quando estiver cheio.
  • Retain – Mantém todos os eventos até que o log esteja cheio e interrompe o registro até ser liberado.
  • AutoBackup – Faz automaticamente backup e arquiva os logs de eventos quando estiver cheio.
Highlighting the LogMode property.

Finalmente, ao analisar a propriedade LogType, existem vários tipos diferentes de logs. Esta propriedade funciona mais como uma propriedade de categorização, mas geralmente informa como o log é usado e os tipos de eventos exibidos.

  • Administrativo – Destinado principalmente a usuários finais e usuários administrativos.
  • Analítico – Geralmente, um log de alto volume, destinado a descrever operações do programa.
  • Depuração – Destinado a desenvolvedores que precisam fazer uma análise profunda das entranhas do programa.
  • Operacional – Um evento que ocorre durante a operação e é útil para diagnosticar ocorrências e acionar processos.
Highlighting the LogType property.

Listando Provedores de Log de Eventos

Agora que você tem uma compreensão sólida dos diferentes logs e suas propriedades, é útil entender o que é um Provedor de Log de Eventos. Um provedor, na terminologia de Log de Eventos, é uma fonte de um evento.

Os provedores de log de eventos são únicos e vinculados a cada log, como logs de Aplicativos ou de Sistema, e servirão como a fonte nomeada de onde um evento se origina.

Talvez você queira encontrar problemas ao filtrar logs e possa estar interessado apenas em problemas de um provedor específico. Para listar quais provedores estão disponíveis, use o parâmetro -ListProvider. Como mostrado abaixo, o * lista todos os provedores disponíveis e a quais logs os provedores estão vinculados, como Windows PowerShell ou Sistema.

Get-WinEvent -ListProvider * | Format-Table -Autosize
Listing event log providers.

Talvez você queira listar apenas os provedores disponíveis para um log específico, como System. Para fazer isso, você pode filtrar eventos usando o comando Where-Object usando os valores da propriedade LogLinks. A propriedade LogLinks mostra os logs de eventos vinculados como uma lista.

Para filtrar os logs solicitados com Where-Object, use o operador de comparação -In para filtrar apenas os eventos com System no valor da propriedade LogLinks. Finalmente, o uso de Format-Table -AutoSize facilita a leitura da saída, como mostrado abaixo.

Get-WinEvent -ListProvider * | Where-Object { 'System' -In ($_ | Select-Object -ExpandProperty Loglinks | Select-Object -ExpandProperty Logname) } | Format-Table -AutoSize
Filtering event log providers to a specific log.

Recuperando Logs de Eventos Clássicos com Get-WinEvent

O primeiro passo para solucionar um problema no Windows é recuperar o log de eventos da Application ou System, que são os Logs de Eventos Clássicos. No exemplo abaixo, você recuperará os primeiros 100 eventos usando o parâmetro -MaxEvents do log de eventos da Application.

Para facilitar a leitura dos resultados, selecione apenas as propriedades necessárias. Caso contrário, as entradas são agrupadas pelo nome do provedor, o que torna difícil analisar a lista de resultados.

Get-WinEvent -LogName 'Application' -MaxEvents 100 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning events from the Application log.

Encontrando Eventos Modernos do Windows com Get-WinEvent

Agora que você recuperou eventos do log clássico de Aplicativos, que tal resultados de um Log de Eventos do Windows mais novo, como Microsoft-Windows-WindowsUpdateClient/Operacional?

Ao contrário de um log de eventos clássico, como System, o Microsoft-Windows-WindowsUpdateClient/Operacional é um log moderno, com o Get-WinEvent funcionando da mesma forma que abaixo.

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning Windows Event Log records.

Que tal obter apenas os eventos mais antigos? Embora você possa inverter a ordem dos resultados com Sort-Object, use o parâmetro -Oldest para recuperar os primeiros 10 eventos, conforme mostrado abaixo.

O comando Get-WinEvent faz a filtragem para você, em vez de retornar todos os resultados e ordená-los, o que é tipicamente mais lento.

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -Oldest -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning only the oldest events in a Windows Event Log.

Recuperando Arquivos de Rastreamento de Eventos para Windows (ETW) com Get-WinEvent

Talvez você tenha um arquivo *.evtx exportado de outro computador ou tenha feito backup de um log existente. Você pode ler esses logs com o cmdlet Get-WinEvent. Se você precisa manter logs para fins de auditoria, Get-WinEvent é uma ótima maneira de consultar esses logs rapidamente com cmdlets padrão dentro de scripts.

Para demonstrar a recuperação de entradas de log de um arquivo *.evtx, você precisa de um arquivo de log exportado.

1. Abra o Visualizador de Eventos e navegue até um log. Neste exemplo, o log Application and Services Logs → Windows PowerShell.

Navigate to a Windows Event Viewer log.

2. Em seguida, clique no item de menu Salvar Todos os Eventos Como… no painel Ações.

Save the log file.

3. Salve o arquivo em um local de disco para ser recuperado pelo comando Get-WinEvent.

Choose a location to save the log file.

Agora que você exportou um arquivo de log, passe a localização do arquivo de log via parâmetro -Path para ler os eventos. No exemplo mostrado abaixo, o log do Windows PowerShell é exportado para consumo posterior.

Get-WinEvent -Path 'C:\Articles\WindowsPowerShell.evtx' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Retrieving specific events from the exported event file.

Filtrando Logs de Eventos do Windows Usando Get-WinEvent

Embora você pudesse filtrar logs com o cmdlet padrão Where-Object, Get-WinEvent oferece filtros integrados. Ao retornar todos os resultados e depois filtrar, mais trabalho é feito do que o necessário. Em vez disso, você sempre deve tentar filtrar na origem o máximo possível.

O cmdlet Get-WinEvent fornece três parâmetros para ajudá-lo a filtrar milhares de eventos chamados -FilterHashTable, -FilterXPath e -FilterXML. Cada parâmetro geralmente executa a mesma tarefa, apenas de maneira diferente.

Filtrando Logs de Eventos com FilterHashTable

O parâmetro -FilterHashTable filtra o conteúdo com base nas propriedades correspondentes, como LogName. Em vez de usar o parâmetro -LogName para filtrar por um log específico, você pode usar um hash table, como @{'LogName' = 'Application'}, que corresponderia à propriedade de evento LogName.

O exemplo mostrado abaixo fornece um hash table para o parâmetro -FilterHashTable que procura apenas o log de Aplicativos e com um horário de início que é todos os eventos após a meia-noite do dia atual, o Get-WinEvent retorna rapidamente resultados.

Get-WinEvent -FilterHashTable @{'LogName' = 'Application'; 'StartTime' = (Get-Date -Hour 0 -Minute 0 -Second 0)} | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Filtering events with the FilterHashTable parameter.

Compare as velocidades de filtragem do mesmo comando acima com um filtrado via Where-Object em vez do parâmetro -FilterHashTable no pipeline. Como você pode ver, o comando usando Where-Object é muito mais lento do que aquele que usa o parâmetro -FilterHashTable.

Comparing filtering with FilterHashTable and Where-Object.

Filtrando Logs de Eventos Usando o Parâmetro FilterXPath

As entradas de log de eventos são armazenadas como arquivos XML e, portanto, você pode usar a linguagem XPath, uma linguagem de consulta XML, para filtrar as entradas de log. Realizando o mesmo comando usado acima e traduzindo para XPath, você pode obter os mesmos resultados.

Para criar uma consulta XPath, use a capacidade de filtragem no Visualizador de Eventos do Windows, conforme mostrado abaixo.

1. Abra o Visualizador de Eventos e navegue até um log, como o log Registros do Windows → Aplicativo.

Opening the Windows Event Viewer.

2. Em seguida, clique no link Filtro de Registro Atual no painel à direita.

Choosing to Filter the Current Log.

3. Insira os parâmetros que deseja usar para filtrar o registro.

Creating a filter for the current log.

4. Clique na guia XML e copie a seção contida dentro da tag Select.

Copying the XPath command.

5. Agora, copie e cole o conteúdo copiado com o parâmetro -FilterXPath. Agora você pode ver abaixo que usando a sintaxe XPath encontrada no visualizador de registros de eventos, você pode construir uma consulta para filtrar apenas as informações necessárias.

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[(Level=1  or Level=3)]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Demonstrating the use of the FilterXPath parameter.

Entrar em detalhes sobre como criar consultas XPath está fora do escopo deste artigo, mas o formato básico é mostrado abaixo. Quando o parâmetro FilterXPath filtra uma data, você verá uma grande diferença: você precisa usar um formato de data mais específico, yyyy-MM-ddTHH:mm:ss.fffZ, que a data deve ser retornada em UTC, o que é indicado pelo switch -AsUTC.

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Filtering events using XPath.

Filtrando Resultados de Log de Eventos com FilterXML

Por fim, o último parâmetro de filtragem disponível é o parâmetro -FilterXML. Ao contrário dos parâmetros -FilterXPath e -FilterHashTable, este parâmetro aceita XML que é então usado para filtrar os eventos. O parâmetro -FilterXML permite regras mais complexas e, como mostrado abaixo, pode replicar os exemplos de filtragem anteriores.

Como mostrado no exemplo anterior, você pode recuperar uma consulta pré-formatada da habilidade Visualizador de Eventos → Filtrar Registro Atual. Em vez de selecionar apenas o conteúdo no nó Selecionar, você usará toda a consulta. Não há filtros reais escolhidos, como indicado pelo * no nó Selecionar. Isso fornecerá a marcação geral para o próximo exemplo.

Selecting the entire XML query from Filter Current Log in the Event Viewer.

Em vez de criar um comando de uma linha, primeiro, separe a consulta XML e atribua a marcação a uma variável, $Consulta, no exemplo abaixo. Atribuir a consulta a uma variável torna mais fácil de usar e legível. Em seguida, passe a variável $Consulta para o parâmetro -FilterXML do Get-WinEvent.

Como mostrado abaixo, você vê os resultados da consulta mais complexa retornando todos os eventos daquele dia e armazenados no log de Aplicação.

$Query = "<QueryList>
  <Query Id='0' Path='Application'>
    <Select Path='Application'>*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]</Select>
  </Query>
</QueryList>"

Get-WinEvent -FilterXML $Query | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Showing how FilterXML works.

Conclusão

O cmdlet Get-WinEvent torna rápido o trabalho de consultar várias fontes de log de eventos com poderosas capacidades de filtragem. Da auditoria à resolução de problemas, o cmdlet Get-WinEvent é uma adição crucial para qualquer kit de ferramentas de Administradores de Sistema!

Source:
https://adamtheautomator.com/get-winevent/