Criando consultas Get-WinEvent com FilterHashtable
Este exemplo só se aplica a plataformas Windows.
Para ler a postagem de blog original do Scripting Guy de 3 de junho de 2014, confira Use o FilterHashTable para filtrar log de eventos com o PowerShell.
Este artigo é um trecho da postagem do blog original e explica como usar o parâmetro FilterHashtable do cmdlet Get-WinEvent
para filtrar logs de eventos. O cmdlet Get-WinEvent
do PowerShell é um método poderoso de filtragem de logs de eventos e diagnósticos do Windows. Quando uma consulta Get-WinEvent
usa o parâmetro FilterHashtable, seu desempenho é aprimorado.
Quando você trabalha com grandes logs de eventos, não é eficiente enviar objetos pelo pipeline para um comando Where-Object
. Antes do PowerShell 6, o cmdlet Get-EventLog
era outra opção para obter dados de log. Por exemplo, os comandos a seguir são ineficientes para filtrar os logs Microsoft-Windows-Defrag:
Get-EventLog -LogName Application | Where-Object Source -Match defrag
Get-WinEvent -LogName Application | Where-Object { $_.ProviderName -Match 'defrag' }
O comando a seguir usa uma tabela de hash que melhora o desempenho:
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='*defrag'
}
Postagens no blog sobre enumeração
Este artigo apresenta informações sobre como usar os valores enumerados em uma tabela de hash. Para obter mais informações sobre a enumeração, leia as postagens de blog de Scripting Guy. Para criar uma função que retorne valores enumerados, confira Enumerações e valores. Para obter mais informações, confira a série de postagens de blog sobre enumeração de Scripting Guy.
Pares chave-valor da tabela de hash
Para criar consultas eficientes, use o cmdlet Get-WinEvent
com o parâmetro FilterHashtable.
O FilterHashtable aceita uma tabela de hash como filtro para obter informações específicas de logs de eventos do Windows. Uma tabela de hash usa pares chave-valor. Para obter informações sobre tabelas de hash, confira about_Hash_Tables.
Se os pares chave-valor estiverem na mesma linha, eles deverão ser separados por um ponto e vírgula. Se cada par chave-valor estiver em uma linha separada, o ponto e vírgula não será necessário. Por exemplo, este artigo coloca pares chave-valor em linhas separadas e não usa ponto e vírgula.
Este exemplo usa vários parâmetros FilterHashtable dos pares chave-valor. A consulta completa inclui LogName, ProviderName, Palavras-chave, ID e Nível.
Os pares key-value aceitos são mostrados na tabela a seguir e estão incluídos na documentação do Get-WinEvent FilterHashtable.
A tabela a seguir exibe os nomes de chave, os tipos de dados e se os caracteres curinga são aceitos para um valor de dados.
Nome da chave | Tipo de dados de valor | Aceita caracteres curinga? |
---|---|---|
LogName | <String[]> |
Sim |
ProviderName | <String[]> |
Sim |
Caminho | <String[]> |
Não |
Palavras-chave | <Long[]> |
Não |
ID | <Int32[]> |
Não |
Nível | <Int32[]> |
Não |
StartTime | <DateTime> |
Não |
EndTime | <DateTime> |
Não |
UserID | <SID> |
Não |
Dados | <String[]> |
Não |
<named-data> |
<String[]> |
Não |
A chave <named-data>
representa um campo de dados de evento nomeado. Por exemplo, o evento 1008 do Perflib pode conter os seguintes dados de evento:
<EventData>
<Data Name="Service">BITS</Data>
<Data Name="Library">C:\Windows\System32\bitsperf.dll</Data>
<Data Name="Win32Error">2</Data>
</EventData>
Você pode consultar esses eventos usando o seguinte comando:
Get-WinEvent -FilterHashtable @{LogName='Application'; 'Service'='Bits'}
Observação
A capacidade de consultar <named-data>
foi adicionada no PowerShell 6.
Como criar uma consulta com uma tabela de hash
Para verificar os resultados e solucionar problemas, convém criar a tabela de hash com um par chave-valor de cada vez. A consulta obtém dados de log do Aplicativo. A tabela de hash é equivalente a Get-WinEvent -LogName Application
.
Para começar, crie uma consulta Get-WinEvent
. Use o par chave-valor do parâmetro FilterHashtable com a chave LogName e o valor Aplicativo.
Get-WinEvent -FilterHashtable @{
LogName='Application'
}
Continue a criar a tabela de hash com a chave ProviderName. Geralmente, o ProviderName é o nome exibido no campo Fonte no Visualizador de Eventos do Windows. Por exemplo, .NET Runtime
na captura de tela a seguir:
Imagem das fontes do Visualizador de Eventos do Windows
Atualize a tabela de hash e inclua o par chave-valor com a chave, ProviderName, e o valor, .NET Runtime
.
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
}
Observação
Para alguns provedores de eventos, o ProviderName correto pode ser obtido observando a guia Detalhes em Propriedades do Evento. Por exemplo, eventos em que o campo Origem mostra Defrag
, o ProviderName correto é Microsoft-Windows-Defrag
.
Se sua consulta precisar obter dados de logs de eventos arquivados, use a chave Caminho. O valor Caminho especifica o caminho completo para o arquivo de log. Para obter mais informações, confira a postagem no blog do Scripting Guy, Use o PowerShell para analisar erros de log de eventos salvos.
Usando valores enumerados em uma tabela de hash
A chave Palavras-chave é a próxima na tabela de hash. O tipo de dados Palavras-chave é uma matriz do tipo de valor [long]
que contém um número grande. Use o seguinte comando para encontrar o valor máximo de [long]
:
[long]::MaxValue
9223372036854775807
Para a chave Palavras-chave, o PowerShell usa um número, não uma cadeia de caracteres, como Segurança. Embora sejam valores enumerados, o Visualizador de Eventos do Windows exibe as Palavras-chave como cadeias de caracteres. Na tabela de hash, se você usar a chave Palavras-chave com um valor de cadeia de caracteres, será exibida uma mensagem de erro.
Abra o Visualizador de Eventos do Windows e, no painel Ações, clique em Filtrar o registro atual. O menu suspenso Palavras-chave exibe as palavras-chave disponíveis, conforme mostrado na captura de tela a seguir:
Imagem das palavras-chave do Visualizador de Eventos do Windows
Use o seguinte comando para exibir os nomes das propriedades StandardEventKeywords
.
[System.Diagnostics.Eventing.Reader.StandardEventKeywords] |
Get-Member -Static -MemberType Property
TypeName: System.Diagnostics.Eventing.Reader.StandardEventKeywords
Name MemberType Definition
—- ———- ———-
AuditFailure Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
AuditSuccess Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
CorrelationHint Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
CorrelationHint2 Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
EventLogClassic Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
None Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
ResponseTime Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
Sqm Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
WdiContext Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
WdiDiagnostic Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
Os valores enumerados estão documentados no .NET Framework. Para obter mais informações, confira Enumeração StandardEventKeywords.
Os nomes e valores enumerados das Palavras-chave são os seguintes:
Nome | Valor |
---|---|
AuditFailure | 4503599627370496 |
AuditSuccess | 9007199254740992 |
CorrelationHint2 | 18014398509481984 |
EventLogClassic | 36028797018963968 |
Sqm | 2251799813685248 |
WdiDiagnostic | 1125899906842624 |
WdiContext | 562949953421312 |
ResponseTime | 281474976710656 |
Nenhum | 0 |
Atualize a tabela de hash e inclua o par chave-valor com a chave Palavras-chave e o valor de enumeração EventLogClassic, 36028797018963968.
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
}
Valor da propriedade estática das palavras-chave (opcional)
A chave Palavras-chave é enumerada, mas é possível usar um nome de propriedade estático na consulta da tabela de hash. Em vez de usar a cadeia de caracteres retornada, o nome da propriedade deve ser convertido em um valor com a propriedade Value__ .
Por exemplo, o script a seguir usa a propriedade Value__ .
$C = [System.Diagnostics.Eventing.Reader.StandardEventKeywords]::EventLogClassic
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=$C.Value__
}
Filtragem por ID do evento
Para obter dados mais específicos, os resultados da consulta são filtrados por ID do evento. O ID do evento é referenciado na tabela de hash como o ID chave e o valor é um ID de evento específico. O Visualizador de Eventos do Windows exibe o ID do evento. Este exemplo usa o ID do evento 1023.
Atualize a tabela de hash e inclua o par chave-valor com a chave, ID e o valor 1023.
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
}
Filtragem por nível
Para refinar ainda mais os resultados e incluir apenas os eventos de erros, use a chave Nível. Embora seja um valor enumerado, o Visualizador de Eventos do Windows exibe o Nível como valores de cadeias de caracteres. Na tabela de hash, se você usar a chave Nível com um valor de cadeia de caracteres, será exibida uma mensagem de erro.
O Nível tem valores como Erro, Aviso ou Informativo. Use o seguinte comando para exibir os nomes das propriedades StandardEventLevel
.
[System.Diagnostics.Eventing.Reader.StandardEventLevel] |
Get-Member -Static -MemberType Property
TypeName: System.Diagnostics.Eventing.Reader.StandardEventLevel
Name MemberType Definition
---- ---------- ----------
Critical Property static System.Diagnostics.Eventing.Reader.StandardEventLevel Critical {get;}
Error Property static System.Diagnostics.Eventing.Reader.StandardEventLevel Error {get;}
Informational Property static System.Diagnostics.Eventing.Reader.StandardEventLevel Informational {get;}
LogAlways Property static System.Diagnostics.Eventing.Reader.StandardEventLevel LogAlways {get;}
Verbose Property static System.Diagnostics.Eventing.Reader.StandardEventLevel Verbose {get;}
Warning Property static System.Diagnostics.Eventing.Reader.StandardEventLevel Warning {get;}
Os valores enumerados estão documentados no .NET Framework. Para obter mais informações, confira Enumeração de StandardEventKeywords.
Os nomes e valores enumerados de Nível são os seguintes:
Nome | Valor |
---|---|
Detalhado | 5 |
Informativo | 4 |
Aviso | 3 |
Erro | 2 |
Crítico | 1 |
LogAlways | 0 |
A tabela de hash para a consulta completa inclui a chave do Nível e o valor 2.
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
Level=2
}
Propriedade estática de nível na enumeração (opcional)
A chave do Nível é enumerada, mas você pode usar um nome de propriedade estático na consulta da tabela de hash. Em vez de usar a cadeia de caracteres retornada, o nome da propriedade deve ser convertido em um valor com a propriedade Value__ .
Por exemplo, o script a seguir usa a propriedade Value__ .
$C = [System.Diagnostics.Eventing.Reader.StandardEventLevel]::Informational
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
Level=$C.Value__
}