Get-WinEvent PowerShell Cmdlet 사용에 대한 완전 가이드

Windows에는 여러 가지 다른 이벤트 로그가 있지만, 어떻게 빠르게 검색할 수 있을까요? Get-WinEvent cmdlet을 사용하면 시스템 및 응용 프로그램 로그와 같은 클래식 Windows 이벤트 로그, Windows 이벤트 로그 기술에 의해 생성된 로그, 심지어 Windows 이벤트 추적(ETW) 로그까지 검색할 수 있습니다!

이 글에서는 이벤트 로그에서 이벤트를 검색하고 필터링하는 방법을 Get-WinEvent을 사용하여 알아봅시다!

사전 요구 사항

이 글을 따라하기 위해서는 현재 버전의 Windows 10과 PowerShell 5.1 이상이 필요합니다. 이 글은 Windows 10과 PowerShell 7.1을 사용하고 있습니다.

Get-WinEvent를 사용한 사용 가능한 로그 목록

어떤 로그 항목이 필요한지 알기 어렵습니다. Get-WinEvent를 사용하면 -ListLog 매개변수를 사용하여 빠르게 모든 사용 가능한 로그를 나열할 수 있습니다. * 매개변수 값은 필터링 없이 모든 로그를 나열하도록 Get-WinEvent에 지시합니다. 아래에 보여주는 것처럼 모든 로그가 검색되지만, Select-Object cmdlet을 사용하여 제한된 속성 세트만 표시됩니다.

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

모든 로그가 기본적으로 활성화되어 있는 것은 아닙니다. 이벤트가 표시되기 전에 이벤트 뷰어를 열어 로그를 찾고 마우스 오른쪽 버튼으로 클릭하여 로그를 활성화해야 할 수도 있습니다.

Listing all available event logs.

모든 Windows Vista 이후의 로그는 이전의 *.evt 형식이 아닌 *.evtx 파일로 저장됩니다. IsClassicLog 속성은 로그 이벤트가 메시지 파일*.mc 형식이거나 manifest*.xml 형식으로 정의되었는지를 나타냅니다.

흥미로운 속성은 LogMode입니다. 보통 Circular으로 설정되어 있는 것을 알 수 있습니다.

  • Circular – 가득 찰 때 가장 오래된 로그 항목을 덮어쓰기합니다.
  • Retain – 로그가 가득 찰 때까지 모든 이벤트를 유지하고, 해제될 때까지 로깅을 중지합니다.
  • AutoBackup – 로그가 가득 차면 자동으로 백업하고 이벤트 로그를 아카이브합니다.
Highlighting the LogMode property.

마지막으로, LogType 속성을 살펴보면 여러 가지 유형의 로그가 있습니다. 이 속성은 주로 분류 속성으로 사용되지만, 일반적으로 로그의 사용 방법과 표시되는 이벤트 유형을 알려줍니다.

  • 관리 – 주로 최종 사용자와 관리자를 위해 만들어졌습니다.
  • 분석 – 일반적으로 높은 볼륨의 로그로, 프로그램 작동을 설명하는 데 사용됩니다.
  • 디버그 – 프로그램 내부를 심층적으로 파헤치고자 하는 개발자를 위해 만들어졌습니다.
  • 운영 – 운영 중 발생하는 이벤트로, 발생 상황을 진단하고 프로세스를 트리거하는 데 유용합니다.
Highlighting the LogType property.

이벤트 로그 공급자 목록

다양한 로그 및 속성에 대한 이해가 soli로되면, 이벤트 로그 공급자가 무엇인지 이해하는 것이 도움이됩니다. 이벤트 로그 용어에서 공급자는 이벤트의 원본입니다.

이벤트 로그 공급자는 각 로그와 연결되어 있으며, 응용 프로그램 또는 시스템 로그와 같은 명명된 소스로서 이벤트가 발생하는 곳을 제공합니다.

로그를 필터링하여 문제를 찾고 특정 공급자의 문제에만 관심이있을 수 있습니다. 사용 가능한 공급자를 나열하려면 -ListProvider 매개 변수를 사용하십시오. 아래와 같이 *는 사용 가능한 모든 공급자와 해당 공급자가 연결된 로그를 나열합니다. Windows PowerShell 또는 시스템과 같은.

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

아마도 특정 로그에만 사용 가능한 공급 업체를 나열하고 싶을 수도 있습니다. 예를 들어 System과 같은 로그에 대해서만 사용 가능한 공급 업체를 나열하려면 LogLinks 속성의 값들을 사용하여 이벤트를 필터링할 수 있습니다.

Where-Object 명령을 사용하여 요청된 로그를 필터링하려면 Where-Object를 사용하여 LogLinks 속성 값 중에 System이 포함된 이벤트만 필터링하도록 -In 비교 연산자를 사용하십시오. 마지막으로 Format-Table -AutoSize을 사용하면 아래에 표시된 것처럼 출력물을 읽기 쉽게 만들 수 있습니다.

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.

Get-WinEvent로 클래식 이벤트 로그 가져오기

Windows 문제 해결의 첫 번째 단계는 애플리케이션 또는 시스템 로그, 즉 클래식 이벤트 로그를 가져오는 것입니다. 아래 예제에서는 애플리케이션 이벤트 로그의 -MaxEvents 매개변수를 사용하여 처음 100개의 이벤트를 검색할 것입니다.

결과를 읽기 쉽게 만들기 위해 항목을 선택하여 결과를 읽기 쉽게 만드십시오. 그렇지 않으면 항목은 공급 업체 이름으로 그룹화되어 결과 목록을 구문 분석하기가 어려워집니다.

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

Get-WinEvent를 사용하여 현대적인 Windows 이벤트 찾기

이제 고전적인 응용 프로그램 로그에서 이벤트를 검색했으니, Microsoft-Windows-WindowsUpdateClient/Operational과 같은 새로운 Windows 이벤트 로그에서 결과를 어떻게 얻을까요?

System과 같은 고전적인 이벤트 로그와 달리, Microsoft-Windows-WindowsUpdateClient/OperationalGet-WinEvent가 아래와 같이 동작하는 현대적인 로그입니다.

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

가장 오래된 이벤트만 얻을 수 있을까요? 결과를 반대로 정렬할 수는 있지만, 첫 번째 10 이벤트를 검색하려면 -Oldest 매개 변수를 사용하십시오. 아래에 표시된대로.

Get-WinEvent 명령은 모든 결과를 반환하고 정렬하는 대신 필터링을 수행하므로 일반적으로 더 느립니다.

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.

Get-WinEvent를 사용하여 이벤트 추적을 위한 Windows (ETW) 파일 검색

다른 컴퓨터에서 내보낸 *.evtx 파일이나 기존 로그를 백업한 경우, Get-WinEvent cmdlet로 해당 로그를 읽을 수 있습니다. 감사 목적으로 로그를 유지해야하는 경우, Get-WinEvent는 스크립트 내에서 표준 cmdlet를 사용하여 해당 로그를 쿼리하는 훌륭한 방법입니다.

*.evtx 파일에서 로그 항목을 검색하기 위해서는 내보낸 로그 파일이 필요합니다.

1. 이벤트 뷰어를 열고 로그로 이동합니다. 이 예제에서는 응용 프로그램 및 서비스 로그 → Windows PowerShell 로그를 선택합니다.

Navigate to a Windows Event Viewer log.

2. 다음으로 작업 창에서 모든 이벤트 저장 메뉴 항목을 클릭합니다.

Save the log file.

3. 파일을 Get-WinEvent 명령어에서 검색할 디스크 위치로 저장합니다.

Choose a location to save the log file.

이제 로그 파일을 내보냈으므로 로그 파일 위치를 -Path 매개 변수를 통해 전달하여 이벤트를 읽을 수 있습니다. 아래 예에서는 Windows PowerShell 로그가 나중에 사용할 수 있도록 내보내집니다.

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.

Get-WinEvent를 사용하여 Windows 이벤트 로그 필터링하기

Where-Object cmdlet로 로그를 필터링할 수 있지만, Get-WinEvent를 사용하면 내장된 필터를 제공합니다. 모든 결과를 반환한 다음 필터링하는 것보다 필요한 작업이 더 많이 수행됩니다. 대신 가능한 한 원본에서 필터링하도록 항상 노력해야 합니다.

Get-WinEvent cmdlet는 -FilterHashTable, -FilterXPath, -FilterXML이라는 세 가지 매개 변수를 제공하여 수천 개의 이벤트를 필터링하는 데 도움을 줍니다. 각 매개 변수는 일반적으로 동일한 작업을 수행하지만 다른 방식으로 수행됩니다.

FilterHashTable를 사용하여 이벤트 로그 필터링하기

-FilterHashTable 매개변수는 일치하는 속성에 따라 내용을 필터링합니다. 예를 들어 LogName과 같습니다. 특정 로그로 필터링하기 위해 -LogName 매개변수를 사용하는 대신 @{'LogName' = 'Application'}과 같은 해시 테이블을 사용할 수 있습니다. 이는 LogName 이벤트 속성과 해당됩니다.

아래 표시된 예제는 현재 날짜의 자정 이후의 모든 이벤트 및 애플리케이션 로그만 찾는 -FilterHashTable 매개변수에 해시 테이블을 제공합니다. Get-WinEvent는 결과를 빠르게 반환합니다.

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.

동일한 명령의 필터링 속도를 파이프라인의 -FilterHashTable 매개변수 대신 Where-Object를 통해 필터링한 것과 비교하십시오. Where-Object를 사용한 명령이 -FilterHashTable 매개변수를 사용한 명령보다 훨씬 느립니다.

Comparing filtering with FilterHashTable and Where-Object.

FilterXPath 매개변수를 사용하여 이벤트 로그 필터링

이벤트 로그 항목은 XML 파일로 저장되므로 로그 항목을 필터링하기 위해 XML 쿼리 언어인 XPath 언어를 사용할 수 있습니다. 위에서 사용한 동일한 명령을 사용하고 XPath로 변환하면 동일한 결과를 얻을 수 있습니다.

XPath 쿼리를 작성하려면 Windows 이벤트 뷰어의 필터링 기능을 사용하십시오. 아래에 표시된 것과 같습니다.

1. 이벤트 뷰어를 열고 Windows Logs → Application 로그와 같은 로그로 이동합니다.

Opening the Windows Event Viewer.

2. 그다음, 오른쪽 창에 있는 “현재 로그 필터링” 링크를 클릭합니다.

Choosing to Filter the Current Log.

3. 로그를 필터링하려는 매개변수를 입력합니다.

Creating a filter for the current log.

4. XML 탭을 클릭하고 선택 태그 내에 포함된 섹션을 복사합니다.

Copying the XPath command.

5. 이제 복사한 내용을 -FilterXPath 매개변수와 함께 붙여넣습니다. 이제 이벤트 로그 뷰어에서 발견한 XPath 구문을 사용하여 필요한 정보만 필터링하는 쿼리를 작성할 수 있습니다.

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.

XPath 쿼리 작성 방법에 대한 심층적인 설명은 이 문서의 범위를 벗어납니다. 그러나 기본 형식은 아래에 표시되어 있습니다. FilterXPath 매개변수가 날짜를 필터링할 때, 큰 차이점이 하나 있습니다: 더 구체적인 날짜 형식인 yyyy-MM-ddTHH:mm:ss.fffZ를 사용해야 합니다. 날짜는 UTC로 반환되어야 하며, 이는 -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.

FilterXML을 사용하여 이벤트 로그 결과 필터링하기

마지막으로 사용 가능한 필터링 매개변수는 -FilterXML 매개변수입니다. -FilterXPath-FilterHashTable 매개변수와 달리 이 매개변수는 이벤트를 필터링하는 데 사용되는 XML을 취합니다. -FilterXML 매개변수를 사용하면 더 복잡한 규칙을 적용할 수 있으며, 아래에 표시된대로 이전 필터링 예제를 복제할 수 있습니다.

이전 예제에서 보듯이 이벤트 뷰어 → 현재 로그 필터 기능에서 사전 형식으로 쿼리를 검색할 수 있습니다. Select 노드에서 콘텐츠만 선택하는 대신 전체 쿼리를 사용합니다. 실제 필터가 선택되지 않았으며 Select 노드의 *에 의해 나타납니다. 다음 예제의 일반적인 마크업을 제공합니다.

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

한 줄 명령을 생성하는 대신 XML 쿼리를 먼저 분리하고 아래 예제에서 변수 $Query에 마크업을 할당합니다. 쿼리를 변수에 할당하면 사용 편의성과 가독성이 향상됩니다. 그런 다음 Get-WinEvent-FilterXML 매개변수에 $Query 변수를 전달합니다.

아래 예에서 해당 날짜의 모든 이벤트를 반환하고 Application 로그에 저장된 보다 복잡한 쿼리 결과를 볼 수 있습니다.

$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.

결론

Get-WinEvent cmdlet은 강력한 필터링 기능으로 여러 이벤트 로그 원본을 쿼리하는 작업을 간단하게 처리합니다. 감사부터 문제 해결까지 Get-WinEvent cmdlet은 시스템 관리자의 도구 상자에 필수적인 추가입니다!

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