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

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

Neste artigo, aprenda a aproveitar o Get-WinEvent para recuperar e filtrar eventos dos 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á utilizando 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 logs disponíveis. Com o Get-WinEvent, você pode listar todos os logs disponíveis rapidamente usando o parâmetro -ListLog. O valor do parâmetro * diz ao Get-WinEvent para listar todos os logs sem filtragem. Como mostrado abaixo, todos os logs 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 logs estão habilitados por padrão. Talvez seja necessário abrir o Visualizador de Eventos, localizar o log e clicar com o botão direito para Habilitar o log antes que os eventos sejam exibidos.

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 são definidos em um arquivo de Mensagem, formato *.mc, ou em um manifesto, formato *.xml.

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

  • Circular – Sobrescreva a entrada de log mais antiga quando estiver cheio.
  • Retain – Mantenha todos os eventos até que o log esteja cheio e pare de registrar até liberado.
  • AutoBackup – Faça automaticamente backup e arquive os logs de eventos quando estiverem cheios.
Highlighting the LogMode property.

Por fim, ao observar a propriedade LogType, existem vários tipos diferentes de logs. Esta propriedade serve mais como uma propriedade de categorização, mas geralmente informa como o log é usado e os tipos de eventos mostrados.

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

Listagem de Provedores de Registro de Eventos

Agora que você tem um entendimento sólido dos diferentes registros e suas propriedades, ajuda a entender o que é um Provedor de Registro de Eventos. Um provedor, em terminologia de registro de eventos, é uma fonte de um evento.

Os provedores de registro de eventos são únicos e vinculados a cada registro, como os registros de Aplicativo ou Sistema, e servirão como a fonte nomeada de onde um evento se origina.

Talvez você queira encontrar problemas ao filtrar registros e talvez esteja 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 registros 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 os 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 -In operador de comparação para filtrar apenas os eventos com System no valor da propriedade LogLinks. Por fim, 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 na solução de problemas de um problema do Windows é recuperar o log de Application ou System, que são Logs de Eventos Clássicos. No exemplo mostrado abaixo, você irá recuperar os primeiros 100 eventos usando o parâmetro -MaxEvents do log de eventos de Application.

Para facilitar a leitura dos resultados, selecione apenas as propriedades necessárias para ler as entradas com mais facilidade. Caso contrário, as entradas são agrupadas pelo nome do provedor, o que torna a análise da lista de resultados difícil.

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

Encontrar Eventos Modernos do Windows com Get-WinEvent

Agora que você recuperou eventos do log de aplicativos clássico, e quanto aos resultados de um log de evento mais recente do Windows, como Microsoft-Windows-WindowsUpdateClient/Operational?

Ao contrário de um log de evento clássico, como System, o Microsoft-Windows-WindowsUpdateClient/Operational é 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.

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

O comando Get-WinEvent filtra os resultados para você em vez de retornar todos os resultados e ordená-los, o que é geralmente 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 exportado *.evtx 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 com cmdlets padrão dentro de scripts rapidamente.

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 vá para um log. Neste exemplo, o log Logs de Aplicativos e Serviços → Windows PowerShell.

Navigate to a Windows Event Viewer log.

2. Em seguida, clique em Salvar Todos os Eventos Como… no item de menu 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 por meio do 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.

Filtragem de Registros de Eventos do Windows usando Get-WinEvent

Embora você possa filtrar logs com o cmdlet padrão Where-Object, Get-WinEvent oferece filtros incorporados. 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 ajudar na filtragem de milhares de eventos chamados -FilterHashTable, -FilterXPath e -FilterXML. Cada parâmetro geralmente realiza a mesma tarefa, apenas de maneiras diferentes.

Filtragem de Registros 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 hashtable, como @{'LogName' = 'Application'}, que corresponderia à propriedade do evento LogName.

O exemplo abaixo fornece um hashtable para o parâmetro -FilterHashTable que procura apenas o log de Aplicativos e com um horário de início que seja todos os eventos após a meia-noite do dia atual, Get-WinEvent retorna rapidamente os 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 de via o 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 Registros 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 os registros 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, como mostrado abaixo.

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

Opening the Windows Event Viewer.

2. Em seguida, clique no link Filtrar Registro Atual no painel direito.

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 log de eventos, pode criar 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 elaborar 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: é necessário usar um formato de data mais específico, yyyy-MM-ddTHH:mm:ss.fffZ, e a data deve ser retornada em UTC, como indicado pelo interruptor -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

Finalmente, 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 é usado para filtrar os eventos. O parâmetro -FilterXML permite regras mais complexas e, como mostrado abaixo, pode replicar os exemplos de filtragem anteriores.

Conforme mostrado no exemplo anterior, você pode recuperar uma consulta pré-formatada da capacidade de Visualizador de Eventos → Filtrar Log Atual. Em vez de apenas selecionar 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, $Query, no exemplo abaixo. Atribuir a consulta a uma variável torna a utilização e a legibilidade melhores. Em seguida, passe a variável $Query para o parâmetro -FilterXML de Get-WinEvent.

Conforme mostrado abaixo, você vê os resultados da consulta mais complexa retornando todos os eventos daquele dia e armazenados no log Aplicativo.

$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 facilita a consulta de várias fontes de log de eventos com poderosas capacidades de filtragem. Desde auditoria até resolução de problemas, o cmdlet Get-WinEvent é uma adição crucial para o arsenal de qualquer Administrador de Sistemas!

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