FilterHashtable를 사용하여 Get-WinEvent 쿼리 만들기

이 샘플은 Windows 플랫폼에만 적용됩니다.

원래 2014 년 6월 3일 Scripting Guy 블로그 게시물을 읽으려면 FilterHashTable을 사용하여 PowerShell을 사용하여 이벤트 로그를 필터링합니다.

이 문서는 원래 블로그 게시물의 발췌 내용이며 cmdlet의 FilterHashtable 매개 변수를 사용하여 Get-WinEvent 이벤트 로그를 필터링하는 방법을 설명합니다. PowerShell의 Get-WinEvent cmdlet은 Windows 이벤트 및 진단 로그를 필터링하는 강력한 방법입니다. Get-WinEvent 쿼리가 FilterHashtable 매개 변수를 사용하면 성능이 개선됩니다.

대규모 이벤트 로그를 사용할 경우 개체를 파이프라인 아래로 보내 Where-Object 명령으로 전달하는 것은 효율적이지 않습니다. PowerShell 6 이전에는 cmdlet이 Get-EventLog 로그 데이터를 가져오는 또 다른 옵션이었습니다. 예를 들어, 다음 명령은 Microsoft-Windows-Defrag 로그를 필터링하는 데 비효율적입니다.

Get-EventLog -LogName Application | Where-Object Source -Match defrag

Get-WinEvent -LogName Application | Where-Object { $_.ProviderName -Match 'defrag' }

다음 명령은 성능을 향상시키는 해시 테이블을 사용합니다.

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='*defrag'
}

열거형에 대한 블로그 게시물

이 문서에서는 해시 테이블의 열거된 값을 사용하는 방법에 대한 정보를 제공합니다. 열거형에 대한 자세한 내용은 이 Scripting Guy 블로그 게시물을 참조하세요. 열거형 값을 반환하는 함수를 만들려면 열거형 및 값을 참조 하세요. 자세한 내용은 열거형에 대한 블로그 게시물의 Scripting Guy 시리즈를 참조하세요.

해시 테이블 키-값 쌍

효율적인 쿼리를 빌드하려면 FilterHashtable 매개 변수와 함께 cmdlet을 사용합니다Get-WinEvent. FilterHashtable은 Windows 이벤트 로그에서 특정 정보를 가져오기 위한 필터로 해시 테이블을 사용합니다. 해시 테이블은 키-값 쌍을 사용합니다. 해시 테이블에 대한 자세한 내용은 about_Hash_Tables를 참조하세요.

키-값 쌍이 같은 줄에 있으면 세미콜론으로 구분해야 합니다. 각 키-값 쌍이 별도의 줄에 있으면 세미콜론이 필요하지 않습니다. 예를 들어 이 문서에서는 키-값 쌍을 서로 다른 줄에 배치하며 세미콜론을 사용하지 않습니다.

이 샘플에서는 FilterHashtable 매개 변수의 키-값 쌍 중 몇 가지를 사용합니다. 완료된 쿼리에는 LogName, ProviderName, 키워드, ID수준이 포함됩니다.

허용되는 키-값 쌍은 다음 표에 나와 있으며 Get-WinEventFilterHashtable 매개 변수에 대한 설명서에 포함되어 있습니다.

다음 표에서는 키 이름, 데이터 형식 및 와일드카드 문자가 데이터 값에 허용되는지 여부를 표시합니다.

키 이름 값 데이터 형식 와일드카드 문자 허용 여부
Logname <String[]>
ProviderName <String[]>
Path <String[]> 아니요
키워드 <Long[]> 아니요
ID <Int32[]> 아니요
수준 <Int32[]> 아니요
StartTime <DateTime> 아니요
EndTime <DateTime> 아니요
UserID <SID> 아니요
데이터 <String[]> 아니요
<named-data> <String[]> 아니요

키는 <named-data> 명명된 이벤트 데이터 필드를 나타냅니다. 예를 들어, Perflib 이벤트 1008은 다음 이벤트 데이터를 포함할 수 있습니다.

<EventData>
  <Data Name="Service">BITS</Data>
  <Data Name="Library">C:\Windows\System32\bitsperf.dll</Data>
  <Data Name="Win32Error">2</Data>
</EventData>

다음 명령을 사용하여 이러한 이벤트를 쿼리할 수 있습니다.

Get-WinEvent -FilterHashtable @{LogName='Application'; 'Service'='Bits'}

참고 항목

<named-data>를 쿼리할 수 있는 기능이 PowerShell 6에 추가되었습니다.

해시 테이블을 사용하여 쿼리 빌드

결과를 확인하고 문제를 해결하려면 해시 테이블을 한 번에 하나의 키-값 쌍으로 빌드하는 데 도움이 됩니다. 쿼리는 애플리케이션 로그에서 데이터를 가져옵니다. 해시 테이블은 .에 해당합니다 Get-WinEvent -LogName Application.

시작하려면 쿼리를 만듭니다 Get-WinEvent . FilterHashtable 매개 변수의 키-값 쌍을 키, LogName 및 값인 Application과 함께 사용합니다.

Get-WinEvent -FilterHashtable @{
   LogName='Application'
}

ProviderName 키를 사용하여 해시 테이블을 계속 빌드합니다. 일반적으로 ProviderName은 Windows 이벤트 뷰어 원본 필드에 표시되는 이름입니다. 예를 들어 .NET Runtime 다음 스크린샷에서 다음을 수행합니다.

Windows 이벤트 뷰어 원본 이미지

해시 테이블을 업데이트하고 키, ProviderName 및 값과 함께 키-값 .NET Runtime 쌍을 포함합니다.

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
}

참고 항목

일부 이벤트 공급자의 경우 이벤트 속성세부 정보 탭을 확인하여 올바른 ProviderName을 얻을 수 있습니다. 예를 들어 원본 필드에 올바른 ProviderNameMicrosoft-Windows-Defrag표시되는 Defrag이벤트가 있습니다.

쿼리가 보관된 이벤트 로그에서 데이터를 가져와야 하는 경우 경로 키를 사용합니다. 경로 값은 로그 파일의 전체 경로를 지정합니다. 자세한 내용은 Scripting Guy 블로그 게시물, PowerShell을 사용하여 저장된 이벤트 로그에 오류가 있는지 구문 분석을 참조하세요.

해시 테이블에서 열거형 값 사용

키워드는 해시 테이블의 다음 키입니다. Keywords 데이터 형식은 큰 숫자를 포함하는 [long] 값 형식의 배열입니다. 다음 명령을 사용하여 [long]의 최대 값을 찾습니다.

[long]::MaxValue
9223372036854775807

키워드 키의 경우 PowerShell은 보안과 같은 문자열이 아닌 숫자를 사용합니다. Windows 이벤트 뷰어Keywords를 문자열로 표시하지만 열거형 값입니다. 해시 테이블에서 문자열 값에 Keywords 키를 사용하면 오류 메시지가 표시됩니다.

Windows 이벤트 뷰어 열고 작업 창에서 현재 로그 필터링을 클릭합니다. Keywords 드롭다운 메뉴는 다음 스크린샷에 표시된 것처럼 사용할 수 있는 키워드를 표시합니다.

Windows 이벤트 뷰어 키워드(keyword) 이미지

다음 명령을 사용하여 속성 이름을 표시합니다 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…

열거형 값은 .NET Framework에 설명되어 있습니다. 자세한 내용은 StandardEventKeywords 열거형을 참조하세요.

키워드 이름 및 열거형 값은 다음과 같습니다.

속성
AuditFailure 4503599627370496
AuditSuccess 9007199254740992
CorrelationHint2 18014398509481984
EventLogClassic 36028797018963968
평방미터 2251799813685248
WdiDiagnostic 1125899906842624
WdiContext 562949953421312
ResponseTime 281474976710656
None 0

해시 테이블을 업데이트하고 키, 키워드EventLogClassic 열거형 값 36028797018963968 키-값 쌍을 포함합니다.

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=36028797018963968
}

키워드 정적 속성 값(선택 사항)

키워드 키는 열거되지만 해시 테이블 쿼리에서 정적 속성 이름을 사용할 수 있습니다. 반환된 문자열을 사용하는 대신 속성 이름을 Value__ 속성이 있는 값으로 변환해야 합니다.

예를 들어, 다음 스크립트는 Value__ 속성을 사용합니다.

$C = [System.Diagnostics.Eventing.Reader.StandardEventKeywords]::EventLogClassic
Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=$C.Value__
}

이벤트 ID로 필터링

보다 구체적인 데이터를 가져오기 위해 쿼리의 결과는 이벤트 ID필터링됩니다. 이벤트 ID는 해시 테이블에서 키 ID로 참조되고 값은 특정 이벤트 ID입니다. Windows 이벤트 뷰어 이벤트 ID표시합니다. 이 예제에서는 이벤트 ID 1023을 사용합니다.

해시 테이블을 업데이트하고 키-값 쌍(키: ID, 값: 1023)을 포함합니다.

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=36028797018963968
   ID=1023
}

수준별 필터링

결과를 더 구체화하고 오류인 이벤트만 포함하려면 수준 키를 사용합니다. Windows 이벤트 뷰어Level을 문자열 값으로 표시하지만 열거형 값입니다. 해시 테이블에서 문자열 값과 함께 Level 키를 사용하는 경우 오류 메시지가 표시됩니다.

Level에는 Error, Warning 또는 Informational과 같은 값이 지정됩니다. 다음 명령을 사용하여 속성 이름을 표시합니다 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;}

열거형 값은 .NET Framework에 설명되어 있습니다. 자세한 내용은 StandardEventLevel 열거형을 참조 하세요.

수준 키의 이름 및 열거형 값은 다음과 같습니다.

속성
자세한 정보 표시 5
Informational 4
경고 3
Error 2
위험 1
LogAlways 0

완료된 쿼리에 대한 해시 테이블에는 키, 수준 및 값 2가 포함됩니다.

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=36028797018963968
   ID=1023
   Level=2
}

열거형의 수준 정적 속성(선택 사항)

Level 키는 열거형이지만 해시 테이블 쿼리에서 정적 속성 이름을 사용할 수 있습니다. 반환된 문자열을 사용하는 대신 속성 이름을 Value__ 속성이 있는 값으로 변환해야 합니다.

예를 들어, 다음 스크립트는 Value__ 속성을 사용합니다.

$C = [System.Diagnostics.Eventing.Reader.StandardEventLevel]::Informational
Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=36028797018963968
   ID=1023
   Level=$C.Value__
}