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形式)またはマニフェスト*.xml形式)で定義されているかを示します。

興味深いプロパティはLogModeで、通常はCircularに設定されていることに気付いたかもしれません。

  • Circular – 容量がいっぱいになったら最も古いログエントリを上書きします。
  • Retain – ログがいっぱいになり、解放されるまですべてのイベントを保持し、ログ記録を停止します。
  • AutoBackup – ログがいっぱいになったら自動的にバックアップしてイベントログをアーカイブします。
Highlighting the LogMode property.

最後に、LogTypeプロパティを見ると、さまざまな種類のログがあります。このプロパティは、主にカテゴリ分けプロパティとして機能しますが、通常はログの使用方法と表示されるイベントの種類について通知します。

  • 管理 – 主にエンドユーザーと管理ユーザー向けに意図されています。
  • 分析 – 通常、プログラムの動作を説明するための高いボリュームのログです。
  • デバッグ – プログラムの内部に深く入り込む必要がある開発者向けです。
  • 操作 – 操作中に発生するイベントで、発生を診断し、プロセスをトリガーするのに役立ちます。
Highlighting the LogType property.

イベントログプロバイダーのリストアップ

異なるログとそれらの特性についてのしっかりとした理解を得たので、イベントログプロバイダーとは何かを理解するのに役立ちます。イベントログ用語では、プロバイダーはイベントのソースです。

イベントログプロバイダーは一意であり、各ログにリンクされています。たとえば、アプリケーションログやシステムログなど、イベントが発生する名前付きソースとして機能します。

ログをフィルタリングして問題を見つけたい場合や、特定のプロバイダーの問題にのみ興味がある場合があるかもしれません。使用可能なプロバイダーをリストするには、-ListProviderパラメーターを使用します。以下に示すように、*はすべての使用可能なプロバイダーと、Windows PowerShellやシステムなどのどのログにプロバイダーがリンクされているかをリストします。

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

おそらく、特定のログに利用可能なプロバイダーのリストのみを表示したい場合は、Systemなどの特定のログを使用してイベントをフィルタリングすることができます。これを行うには、Where-Objectコマンドを使用してLogLinksプロパティの値を使用してイベントをフィルタリングできます。 LogLinksプロパティは、リンクされたイベントログをリストとして表示します。

Where-Objectを使用してリクエストされたログをフィルタリングするには、-In比較演算子を使用して、LogLinksプロパティの値がSystemを含むイベントのみをフィルタリングします。最後に、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を使用してClassic Event Logsを取得

Windowsの問題のトラブルシューティングの最初のステップは、アプリケーションまたはシステムログ、つまりClassic Event Logsを取得することです。以下の例では、アプリケーションイベントログの-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/Operationalはモダンなログであり、Get-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.

最も古いイベントだけを取得する方法は?結果を逆順にすることができますが、Sort-Objectを使用して、最初の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コマンドレットを使用して読み取ることができます。監査目的でログを保持する必要がある場合、Get-WinEventは標準のコマンドレットをスクリプト内で迅速に使用してこれらのログをクエリする優れた方法です。

*.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コマンドレットでログをフィルタリングできますが、Get-WinEventには組み込みのフィルターがあります。すべての結果を返してからフィルタリングすると、必要以上の作業が行われます。代わりに、可能な限りソースでフィルタリングすることを常に試みるべきです。

Get-WinEventコマンドレットには、-FilterHashTable-FilterXPath、および-FilterXMLという名前の3つのパラメータが用意されており、これらのパラメータは一般的に同じタスクを実行しますが、異なる方法で行います。

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ログ → アプリケーションログなどのログに移動します。

Opening the Windows Event Viewer.

2. 次に、右側のペインにある「現在のログをフィルタリング」リンクをクリックします。

Choosing to Filter the Current Log.

3. ログをフィルタリングするために使用するパラメータを入力します。

Creating a filter for the current log.

4. XMLタブをクリックし、Selectタグ内に含まれるセクションをコピーします。

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 パラメータが日付をフィルタリングする場合、1つの大きな違いが見られます: より具体的な日付形式、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コマンドレットは、強力なフィルタリング機能を備えた複数のイベントログソースのクエリを短時間で処理します。監査から問題解決まで、Get-WinEventコマンドレットは、システム管理者のツールキットに必須の追加です!

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