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を使用して表示されるプロパティのセットは限られています。
すべてのログがデフォルトで有効になっているわけではありません。 イベントビューアーを開いてログを見つけ、イベントが表示される前にログを右クリックして有効にする必要がある場合があります。

すべてのWindows Vista以降のログは、古い
*.evt
形式ではなく、*.evtx
ファイルとして保存されます。プロパティIsClassicLog
は、ログイベントがメッセージファイル(*.mc
形式)またはマニフェスト(*.xml
形式)で定義されているかを示します。
興味深いプロパティはLogMode
で、通常はCircular
に設定されていることに気付いたかもしれません。
Circular
– 容量がいっぱいになったら最も古いログエントリを上書きします。Retain
– ログがいっぱいになり、解放されるまですべてのイベントを保持し、ログ記録を停止します。AutoBackup
– ログがいっぱいになったら自動的にバックアップしてイベントログをアーカイブします。

最後に、LogType
プロパティを見ると、さまざまな種類のログがあります。このプロパティは、主にカテゴリ分けプロパティとして機能しますが、通常はログの使用方法と表示されるイベントの種類について通知します。
- 管理 – 主にエンドユーザーと管理ユーザー向けに意図されています。
- 分析 – 通常、プログラムの動作を説明するための高いボリュームのログです。
- デバッグ – プログラムの内部に深く入り込む必要がある開発者向けです。
- 操作 – 操作中に発生するイベントで、発生を診断し、プロセスをトリガーするのに役立ちます。

イベントログプロバイダーのリストアップ
異なるログとそれらの特性についてのしっかりとした理解を得たので、イベントログプロバイダーとは何かを理解するのに役立ちます。イベントログ用語では、プロバイダーはイベントのソースです。
イベントログプロバイダーは一意であり、各ログにリンクされています。たとえば、アプリケーションログやシステムログなど、イベントが発生する名前付きソースとして機能します。
ログをフィルタリングして問題を見つけたい場合や、特定のプロバイダーの問題にのみ興味がある場合があるかもしれません。使用可能なプロバイダーをリストするには、-ListProvider
パラメーターを使用します。以下に示すように、*
はすべての使用可能なプロバイダーと、Windows PowerShellやシステムなどのどのログにプロバイダーがリンクされているかをリストします。

おそらく、特定のログに利用可能なプロバイダーのリストのみを表示したい場合は、System
などの特定のログを使用してイベントをフィルタリングすることができます。これを行うには、Where-Object
コマンドを使用してLogLinks
プロパティの値を使用してイベントをフィルタリングできます。 LogLinks
プロパティは、リンクされたイベントログをリストとして表示します。
Where-Object
を使用してリクエストされたログをフィルタリングするには、-In
比較演算子を使用して、LogLinks
プロパティの値がSystem
を含むイベントのみをフィルタリングします。最後に、Format-Table -AutoSize
の使用により、出力を読みやすくすることができます。下記のように表示されます。

Get-WinEvent
を使用してClassic Event Logsを取得
Windowsの問題のトラブルシューティングの最初のステップは、アプリケーションまたはシステムログ、つまりClassic Event Logsを取得することです。以下の例では、アプリケーションイベントログの-MaxEvents
パラメータを使用して最初の100
イベントを取得します。
結果を読みやすくするために、エントリを読みやすくするために必要なプロパティのみを選択します。それ以外の場合、エントリはプロバイダー名でグループ化され、結果のリストを解析するのが難しくなります。

Get-WinEvent
を使用して現代のWindowsイベントを見つける
古典的なアプリケーションログからイベントを取得したので、Microsoft-Windows-WindowsUpdateClient/Operational
などの新しいWindowsイベントログからの結果はどうですか?
System
のような古典的なイベントログとは異なり、Microsoft-Windows-WindowsUpdateClient/Operational
はモダンなログであり、Get-WinEvent
は以下のように機能します。

最も古いイベントだけを取得する方法は?結果を逆順にすることができますが、Sort-Object
を使用して、最初の10
件のイベントを取得するには-Oldest
パラメータを使用します。
Get-WinEvent
コマンドは、通常よりも遅い場合があるすべての結果を返してソートする代わりに、フィルタリングを行います。

Get-WinEvent
を使用してWindowsイベントトレース(ETW)ファイルを取得する
別のコンピューターからエクスポートされた*.evtx
ファイルがあるか、既存のログをバックアップしています。これらのログは、Get-WinEvent
コマンドレットを使用して読み取ることができます。監査目的でログを保持する必要がある場合、Get-WinEvent
は標準のコマンドレットをスクリプト内で迅速に使用してこれらのログをクエリする優れた方法です。
*.evtx
ファイルからログエントリを取得するデモンストレーションには、エクスポートされたログファイルが必要です。
1. イベントビューアを開き、ログに移動します。この例では、アプリケーションとサービスのログ → Windows PowerShellログです。

2. 次に、アクションペインですべてのイベントを保存メニューアイテムをクリックします。

3. ファイルをGet-WinEvent
コマンドで取得するためのディスク場所に保存します。

これで、ログファイルをエクスポートして-Path
パラメータを介してイベントを読み取る準備が整いました。以下の例では、Windows PowerShellログが後で利用できるようにエクスポートされています。

Get-WinEvent
を使用してWindowsイベントログをフィルタリングする
Where-Object
コマンドレットでログをフィルタリングできますが、Get-WinEvent
には組み込みのフィルターがあります。すべての結果を返してからフィルタリングすると、必要以上の作業が行われます。代わりに、可能な限りソースでフィルタリングすることを常に試みるべきです。
Get-WinEvent
コマンドレットには、-FilterHashTable
、-FilterXPath
、および-FilterXML
という名前の3つのパラメータが用意されており、これらのパラメータは一般的に同じタスクを実行しますが、異なる方法で行います。
FilterHashTable
を使用してイベントログをフィルタリングします。
-FilterHashTable
パラメータは、LogName
などの一致するプロパティに基づいてコンテンツをフィルタリングします。特定のログによるフィルタリングに-LogName
パラメータを使用する代わりに、@{'LogName' = 'Application'}
のようなハッシュテーブルを使用することができます。このハッシュテーブルは、LogName
イベントプロパティに対応します。
以下の例では、-FilterHashTable
パラメータにハッシュテーブルを提供しています。このハッシュテーブルは、アプリケーションログだけを検索し、現在の日の深夜以降のすべてのイベントを開始時間としています。これにより、Get-WinEvent
コマンドは迅速に結果を返します。

FilterHashTable
parameter.上記のコマンドと同じコマンドをパイプラインの-FilterHashTable
パラメータではなくWhere-Object
を使用してフィルタリングした場合とのフィルタリング速度を比較してください。上記のWhere-Object
を使用したコマンドは、-FilterHashTable
パラメータを使用したコマンドよりもはるかに遅くなります。

FilterHashTable
and Where-Object
.FilterXPath
パラメータを使用してイベントログをフィルタリングする
イベントログのエントリはXMLファイルとして保存されているため、XMLクエリ言語であるXPathを使用してログエントリをフィルタリングすることができます。上記で使用したコマンドをXPathに変換することで、同じ結果を得ることができます。
XPathクエリを作成するには、Windowsイベントビューアでのフィルタリング機能を使用します。以下に示します。
1. イベントビューアを開き、Windowsログ → アプリケーションログなどのログに移動します。

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

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

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

5. 今、コピーした内容を -FilterXPath
パラメータとともにコピー&ペーストします。以下のように、イベントログビューアから見つかったXPath構文を使用して、必要な情報のみをフィルタリングするクエリを構築できることがわかります。

FilterXPath
parameter.XPathクエリの作成方法について詳しく説明することはこの記事の範囲外ですが、基本的な形式は以下のように示されています。 FilterXPath
パラメータが日付をフィルタリングする場合、1つの大きな違いが見られます: より具体的な日付形式、yyyy-MM-ddTHH:mm:ss.fffZ
を使用する必要があります。日付はUTCで返される必要がありますが、これは -AsUTC
スイッチで示されています。

FilterXML
を使用したイベントログの結果のフィルタリング
最後に利用可能な最後のフィルタリングパラメータは -FilterXML
パラメータです。 -FilterXPath
および -FilterHashTable
パラメータとは異なり、このパラメータはイベントをフィルタリングするために使用されるXMLを取ります。 -FilterXML
パラメータを使用すると、より複雑なルールが適用され、前述のフィルタリング例を再現することができます。
前の例に示されているように、イベント ビューアー → 現在のログのフィルター 機能から事前に書式設定されたクエリを取得できます。 Select
ノード内のコンテンツのみを選択するのではなく、クエリ全体を使用します。 Select
ノード内の *
によって、実際のフィルターは選択されていません。これは、次の例の一般的なマークアップを提供します。

一行のコマンドを作成する代わりに、まずXMLクエリを分離し、以下の例では変数$Query
にマークアップを割り当てます。 クエリを変数に割り当てることで、使用しやすく読みやすくなります。 次に、Get-WinEvent
の-FilterXML
パラメーターに$Query
変数を渡します。
以下に示すように、より複雑なクエリの結果として、その日のすべてのイベントが返され、Application
ログに格納されています。

FilterXML
works.結論
Get-WinEvent
コマンドレットは、強力なフィルタリング機能を備えた複数のイベントログソースのクエリを短時間で処理します。監査から問題解決まで、Get-WinEvent
コマンドレットは、システム管理者のツールキットに必須の追加です!