イベントログファイル (.evtx) を csv ファイルに変換

Windows に標準でインストールされているイベント ビューアーは、ちょっと重いし使いにくいなぁと思って、イベントログ ファイル（.evtx）を .csv ファイルへよく変換しています。

イベント ID、イベントソース、メッセージでフィルターする方法は、覚えてられないので残しておきます。

## PowerShell スクリプト
### 1. evtx を CSV へ変換（基本系）
```powershell
# イベントログファイル
$filePath = "C:\path\to\system.evtx"

# .evtx を .csv に置き換える
$csvFilePath = $filePath -replace '\.evtx$', '.csv'

# CSV へ変換して出力
Get-WinEvent -Path $filePath |
Select-Object TimeCreated,Id,LevelDisplayName,@{ name = "Message"; expression = { $_.Message.Replace("`r`n", "").Replace("`r","").Replace("`n","") }} | 
Sort-Object TimeCreated -Descending | 
Export-Csv -Path $csvFilePath -NoTypeInformation -Encoding UTF8
```

この PowerShell スクリプトは、指定されたイベントログ ファイルからイベント情報を抽出し、特定の形式に整形した後、CSV ファイルとしてエクスポートします。以下に、各ステップの動作を詳しく説明します。

```powershell
Get-WinEvent -Path $filePath
```
`Get-WinEvent` コマンドレットは、イベントログやイベントログ ファイルからイベントを取得します。
`-Path $filePath` では、`$filePath` に指定されたイベントログ ファイル（通常は `.evtx` ファイル）のパスを指定します。このコマンドは、指定されたログファイルからイベントを取得します。

```powershell
Select-Object TimeCreated, Id, LevelDisplayName, @{ name = "Message"; expression = { $_.Message.Replace("`r`n", "").Replace("`r","").Replace("`n","") }}
```

`Select-Object` は、取得したイベントから必要なプロパティだけを選択します。選択されたプロパティは以下の通りです。
 - `TimeCreated`: イベントが発生した日時
 - `Id`: イベントID
 - `LevelDisplayName`: イベントの重要度（例: 情報、警告、エラー）
 - `Message`: イベントのメッセージ内容

`Message` に対しては、改行文字（`\r\n`, `\r`, `\n`）をすべて削除するためのカスタム式が適用されています。これは、メッセージ内容を1行にするための処理です。

```powershell
Sort-Object TimeCreated -Descending
```
`Sort-Object` は、選択されたオブジェクトを指定されたプロパティで並べ替えます。
`TimeCreated` プロパティで並べ替えを行い、`-Descending` オプションによって、最新のイベントが最初に来るように降順に並べ替えます。

```powershell
Export-Csv -Path $csvFilePath -NoTypeInformation -Encoding UTF8
```
`Export-Csv` コマンドレットは、オブジェクトのコレクションをCSVファイルとしてエクスポートします。
`-Path $csvFilePath` では、生成されるCSVファイルのパスを指定します（`$csvFilePath` は変数に格納されたパス）。
`-NoTypeInformation` は、CSVファイルにタイプ情報（`#TYPE System.Management.Automation.PSCustomObject` のような行）を出力しないようにします。
`-Encoding UTF8` は、生成されるCSVファイルをUTF-8でエンコードします。

#### 全体の動作
このスクリプトは、指定されたイベントログファイル（`.evtx`）からイベントデータを取得し、特定の情報（発生日時、イベントID、重要度、メッセージ）を抽出して整形し、その結果を最新のイベントから順に並べ替えて、CSVファイルとして保存します。

このCSVファイルは、後で解析やレポート作成に使用できます。メッセージから改行を削除して1行に整形することで、CSVファイルが見やすくなります。

### 2. 指定した ID でフィルター
例：イベント ID 6005, 6006, 1074 のログを抽出
```powershell
# イベントログファイル
$filePath = "C:\path\to\system.evtx"

# .evtx を .csv に置き換える
$csvFilePath = $filePath -replace '\.evtx$', '.csv'

Get-WinEvent -Path $filePath -FilterXPath "Event/System[EventID=6005 or EventID=6006 or EventID=1074]" |
Select-Object TimeCreated,LevelDisplayName,Id,@{ name = "Message"; expression = { $_.Message.Replace("`r`n", "").Replace("`r","").Replace("`n","") }} | 
Sort-Object TimeCreated -Descending | 
Export-Csv -Path $csvFilePath -NoTypeInformation -Encoding UTF8
```

### 3. メッセージの内容でフィルター
例：イベント メッセージに MEMORY.DMP を含むログを抽出
```powershell
# イベントログファイル
$filePath = "C:\temp\system.evtx"

# .evtx を .csv に置き換える
$csvFilePath = $filePath -replace '\.evtx$', '.csv'

Get-WinEvent -Path $filePath |
Where-Object{$_.Message -like '*MEMORY.DMP*'} |
Select-Object TimeCreated,LevelDisplayName,Id,@{ name = "Message"; expression = { $_.Message.Replace("`r`n", "").Replace("`r","").Replace("`n","") }} | 
Sort-Object TimeCreated -Descending | 
Export-Csv -Path $csvFilePath -NoTypeInformation -Encoding UTF8
```

### 4. イベント ソース名でフィルター
例：イベント ソースが Service Control Manager であるログを抽出
```powershell
# イベントログファイル
$filePath = "C:\temp\system.evtx"

# .evtx を .csv に置き換える
$csvFilePath = $filePath -replace '\.evtx$', '.csv'

Get-WinEvent -Path $filePath -FilterXPath "Event/System[Provider[@Name='Service Control Manager']]" | 
Select-Object TimeCreated,LevelDisplayName,Id,@{ name = "Message"; expression = { $_.Message.Replace("`r`n", "").Replace("`r","").Replace("`n","") }} | 
Sort-Object TimeCreated -Descending | 
Export-Csv -Path $csvFilePath -NoTypeInformation -Encoding UTF8
```

## さいごに
CSV ファイルを VS Code 等で開けば、イベント ビューアーよりも状況の把握が楽になると思いますので、お試しください。CSV ファイルにすると見えない情報があるので、そこは注意です。

## 参考URL
Get-WinEvent (Microsoft.PowerShell.Diagnostics)
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.diagnostics/get-winevent

Where-Object (Microsoft.PowerShell.Core)
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/where-object

Select-Object (Microsoft.PowerShell.Utility)
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/select-object

Sort-Object (Microsoft.PowerShell.Utility)
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/sort-object

Export-Csv (Microsoft.PowerShell.Utility)
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/export-csv