イベントログから Winget の ID と Microsoft Store の URL

たまに Winget でアプリ ID を使ってインストールとアンインストールしているのですが、アプリ ID の確認が簡単にできる方法があったので、残しておきます。

## Winget とは？
Winget は、Microsoft が提供する Windows 用のパッケージ管理ツールであり、コマンドラインで、ソフトウェアの検索、インストール、更新、削除を効率的に行うことができます。なお、開発は GitHub で行われています。

GitHub - microsoft/winget-cli
https://github.com/microsoft/winget-cli

## 私が思う Winget の使いにくいところ
Microsoft Store にあるアプリを簡単にインストールできたり、パッケージをローカルにダウンロードできたりと、非常に有用なツールなのですが、アプリの検索性が悪いと思っています。具体的には、ペイントや電卓を検索すると検索結果がたくさん出てきて、どれが目的のペイントや電卓なのかわかりません。しかも英語名で指定しないといけないです。

解決方法としては、Microsoft Store のアプリには、ストアの製品 ID がついており、この ID を指定することで確実にアプリを指定できます。ただ、その ID って確認するの大変じゃない？

確認方法としては、`winget show` コマンドでパッケージの詳細を確認するほかに Microsoft Store には、Web 版があり、URL に ID が入っているので、URL から ID が確認する方法があります。例えば、電卓は以下の URL ですので、**"9wzdncrfhvn5"** が ID だとわかります。

Windows 電卓：
https://apps.microsoft.com/detail/9wzdncrfhvn5?hl=ja-jp&gl=JP

`winget show` コマンドでも、Web 版 Microsoft Store にしても、検索しないといけないのは変わらないのでなんだかな～ってかんじです。

## イベントログを眺めていたら
別件で、System のイベントログを眺めていたら ID19 でこんなのが記録されているのを見つけました。

>インストールの成功: 次の更新プログラムが正しくインストールされました: 9WZDNCRFHVN5-MICROSOFT.WINDOWSCALCULATOR

この９から始まる英数字は、もしかして電卓のアプリ ID なのでは...
他のイベントログを見てみると、アプリをインストールするとその ID とアプリ名が System のイベントログに記録されるみたいでした。

## イベントログから ID を Get
イベントログにアプリ ID が記録されることがわかったので、さくっと PowerShell でアプリの ID をリストできるスクリプトを作ってみました。

### PowerShell スクリプト
イベントログから ID 19 とアプリインストール関連のイベントを抽出し、ID、Microsoft Store URL、アプリ名を CSV ファイルで出力するスクリプトです。
```powershell
# イベントログファイル
$filePath = "C:\path\to\System.evtx"

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

# ファイルが存在すれば削除
if (Test-Path -Path $outFilePath) {
    Remove-Item -Path $outFilePath
}

# ID からイベントログをフィルター
$eventdata = Get-WinEvent -Path $filePath -FilterXPath "Event/System[EventID=19]" |
Where-Object{$_.Message -match "(9[A-Z0-9]{11})"} | 
Select-Object @{ name = "Message"; expression = { $_.Message.Replace("`r`n", "").Replace("`r","").Replace("`n","") }} -Unique

# ID、Microsoft Store URL、アプリ名を CSV ファイルで出力
$array = New-Object System.Collections.ArrayList  
foreach ($data in $eventdata) {
    if ($data.Message -match "(9[A-Z0-9]{11})") {
        $id = $matches[1]
        $url = "https://apps.microsoft.com/detail/$($id.ToLower())`?hl=ja-jp&gl=JP"
        $appName = ($data.Message -split '-')[1]

        $Object = [PSCustomObject] @{
            id = $id
            url = $url
            appName = $appName
        }
        $array.Add($Object)
    }
}
$array | Sort-Object appName | Export-Csv -Path $outFilePath -NoTypeInformation -Encoding UTF8
```

### 実行結果まとめ
Windows 11 22H2 で実行した結果をまとめてみました。アプリ名は、実際に表示されているアプリの名前ではないので、対応付けが難しいかもしれません。
**MICROSOFT.ZUNEMUSIC** が、Windows メディア プレーヤーとは...

|ID|Microsoft Store URL|アプリ名|
|-----------|------------|------------|
|9P1J8S7CCWWT|https://apps.microsoft.com/detail/9p1j8s7ccwwt?hl=ja-jp&gl=JP|Clipchamp.Clipchamp|
|9NFFX4SZZ23L|https://apps.microsoft.com/detail/9nffx4szz23l?hl=ja-jp&gl=JP|Microsoft.549981C3F5F10|
|9WZDNCRFHVFW|https://apps.microsoft.com/detail/9wzdncrfhvfw?hl=ja-jp&gl=JP|Microsoft.BingNews|
|9WZDNCRFJ3Q2|https://apps.microsoft.com/detail/9wzdncrfj3q2?hl=ja-jp&gl=JP|Microsoft.BingWeather|
|9NBLGGH4NNS1|https://apps.microsoft.com/detail/9nblggh4nns1?hl=ja-jp&gl=JP|Microsoft.DesktopAppInstaller|
|9MV0B5HZVK9Z|https://apps.microsoft.com/detail/9mv0b5hzvk9z?hl=ja-jp&gl=JP|Microsoft.GamingApp|
|9PKDZBMV1H3T|https://apps.microsoft.com/detail/9pkdzbmv1h3t?hl=ja-jp&gl=JP|Microsoft.GetHelp|
|9WZDNCRDTBJJ|https://apps.microsoft.com/detail/9wzdncrdtbjj?hl=ja-jp&gl=JP|MICROSOFT.GETSTARTED|
|9PMMSR1CGPWG|https://apps.microsoft.com/detail/9pmmsr1cgpwg?hl=ja-jp&gl=JP|Microsoft.HEIFImageExtension|
|9N4WGH0Z6VHQ|https://apps.microsoft.com/detail/9n4wgh0z6vhq?hl=ja-jp&gl=JP|Microsoft.HEVCVideoExtension|
|9WZDNCRD29V9|https://apps.microsoft.com/detail/9wzdncrd29v9?hl=ja-jp&gl=JP|MICROSOFT.MICROSOFTOFFICEHUB|
|9WZDNCRFHWD2|https://apps.microsoft.com/detail/9wzdncrfhwd2?hl=ja-jp&gl=JP|Microsoft.MicrosoftSolitaireCollection|
|9NBLGGH4QGHW|https://apps.microsoft.com/detail/9nblggh4qghw?hl=ja-jp&gl=JP|Microsoft.MicrosoftStickyNotes|
|9MW2LKJ0TPJF|https://apps.microsoft.com/detail/9mw2lkj0tpjf?hl=ja-jp&gl=JP|Microsoft.NET.Native.Framework.2.2|
|9PLL735RFDSM|https://apps.microsoft.com/detail/9pll735rfdsm?hl=ja-jp&gl=JP|Microsoft.NET.Native.Runtime.2.2|
|9PCFS5B6T72H|https://apps.microsoft.com/detail/9pcfs5b6t72h?hl=ja-jp&gl=JP|Microsoft.Paint|
|9NBLGGH10PG8|https://apps.microsoft.com/detail/9nblggh10pg8?hl=ja-jp&gl=JP|MICROSOFT.PEOPLE|
|9NFTCH6J7FHV|https://apps.microsoft.com/detail/9nftch6j7fhv?hl=ja-jp&gl=JP|Microsoft.PowerAutomateDesktop|
|9NCTDW2W1BH8|https://apps.microsoft.com/detail/9nctdw2w1bh8?hl=ja-jp&gl=JP|Microsoft.RawImageExtension|
|9MZ95KL8MR0L|https://apps.microsoft.com/detail/9mz95kl8mr0l?hl=ja-jp&gl=JP|Microsoft.ScreenSketch|
|9NBLGGH51CLL|https://apps.microsoft.com/detail/9nblggh51cll?hl=ja-jp&gl=JP|Microsoft.Services.Store.Engagement|
|9NBLGGH5R558|https://apps.microsoft.com/detail/9nblggh5r558?hl=ja-jp&gl=JP|Microsoft.Todos|
|9P5VK8KZB5QZ|https://apps.microsoft.com/detail/9p5vk8kzb5qz?hl=ja-jp&gl=JP|Microsoft.UI.Xaml.2.7|
|9NSTH9KHZDLQ|https://apps.microsoft.com/detail/9nsth9khzdlq?hl=ja-jp&gl=JP|Microsoft.UI.Xaml.2.8|
|9NBLGGH3FRZM|https://apps.microsoft.com/detail/9nblggh3frzm?hl=ja-jp&gl=JP|Microsoft.VCLibs.140.00|
|9NBLGGH4RV3K|https://apps.microsoft.com/detail/9nblggh4rv3k?hl=ja-jp&gl=JP|Microsoft.VCLibs.140.00.UWPDesktop|
|9N4D0MSMP0PT|https://apps.microsoft.com/detail/9n4d0msmp0pt?hl=ja-jp&gl=JP|Microsoft.VP9VideoExtensions|
|9N5TDP8VCMHS|https://apps.microsoft.com/detail/9n5tdp8vcmhs?hl=ja-jp&gl=JP|Microsoft.WebMediaExtensions|
|9PG2DK419DRG|https://apps.microsoft.com/detail/9pg2dk419drg?hl=ja-jp&gl=JP|Microsoft.WebpImageExtension|
|9WZDNCRFJBH4|https://apps.microsoft.com/detail/9wzdncrfjbh4?hl=ja-jp&gl=JP|Microsoft.Windows.Photos|
|9WZDNCRFJ3PR|https://apps.microsoft.com/detail/9wzdncrfj3pr?hl=ja-jp&gl=JP|MICROSOFT.WINDOWSALARMS|
|9P105T65H4Z5|https://apps.microsoft.com/detail/9p105t65h4z5?hl=ja-jp&gl=JP|Microsoft.WindowsAppRuntime.1.3|
|9PB1QWVW0R95|https://apps.microsoft.com/detail/9pb1qwvw0r95?hl=ja-jp&gl=JP|Microsoft.WindowsAppRuntime.1.4|
|9NH2SW16MQ7F|https://apps.microsoft.com/detail/9nh2sw16mq7f?hl=ja-jp&gl=JP|Microsoft.WindowsAppRuntime.1.5|
|9WZDNCRFHVN5|https://apps.microsoft.com/detail/9wzdncrfhvn5?hl=ja-jp&gl=JP|MICROSOFT.WINDOWSCALCULATOR|
|9WZDNCRFJBBG|https://apps.microsoft.com/detail/9wzdncrfjbbg?hl=ja-jp&gl=JP|MICROSOFT.WINDOWSCAMERA|
|9WZDNCRFHVQM|https://apps.microsoft.com/detail/9wzdncrfhvqm?hl=ja-jp&gl=JP|MICROSOFT.WINDOWSCOMMUNICATIONSAPPS|
|9NBLGGH4R32N|https://apps.microsoft.com/detail/9nblggh4r32n?hl=ja-jp&gl=JP|Microsoft.WindowsFeedbackHub|
|9WZDNCRDTBVB|https://apps.microsoft.com/detail/9wzdncrdtbvb?hl=ja-jp&gl=JP|MICROSOFT.WINDOWSMAPS|
|9MSMLRH6LZF3|https://apps.microsoft.com/detail/9msmlrh6lzf3?hl=ja-jp&gl=JP|Microsoft.WindowsNotepad|
|9WZDNCRFHWKN|https://apps.microsoft.com/detail/9wzdncrfhwkn?hl=ja-jp&gl=JP|MICROSOFT.WINDOWSSOUNDRECORDER|
|9WZDNCRFJBMP|https://apps.microsoft.com/detail/9wzdncrfjbmp?hl=ja-jp&gl=JP|MICROSOFT.WINDOWSSTORE|
|9N0DX20HK701|https://apps.microsoft.com/detail/9n0dx20hk701?hl=ja-jp&gl=JP|Microsoft.WindowsTerminal|
|9NKNC0LD5NN6|https://apps.microsoft.com/detail/9nknc0ld5nn6?hl=ja-jp&gl=JP|Microsoft.Xbox.TCUI|
|9NBLGGH537C2|https://apps.microsoft.com/detail/9nblggh537c2?hl=ja-jp&gl=JP|Microsoft.XboxGameOverlay|
|9NZKPSTSNW4P|https://apps.microsoft.com/detail/9nzkpstsnw4p?hl=ja-jp&gl=JP|Microsoft.XboxGamingOverlay|
|9WZDNCRD1HKW|https://apps.microsoft.com/detail/9wzdncrd1hkw?hl=ja-jp&gl=JP|Microsoft.XboxIdentityProvider|
|9P086NHDNB9W|https://apps.microsoft.com/detail/9p086nhdnb9w?hl=ja-jp&gl=JP|Microsoft.XboxSpeechtoTextOverlay|
|9NMPJ99VJBWV|https://apps.microsoft.com/detail/9nmpj99vjbwv?hl=ja-jp&gl=JP|Microsoft.YourPhone|
|9WZDNCRFJ3PT|https://apps.microsoft.com/detail/9wzdncrfj3pt?hl=ja-jp&gl=JP|MICROSOFT.ZUNEMUSIC|
|9WZDNCRFJ3P2|https://apps.microsoft.com/detail/9wzdncrfj3p2?hl=ja-jp&gl=JP|MICROSOFT.ZUNEVIDEO|
|9P7BP5VNWKX5|https://apps.microsoft.com/detail/9p7bp5vnwkx5?hl=ja-jp&gl=JP|MicrosoftCorporationII.QuickAssist|

## さいごに
アプリの更新を一度してみないとこの方法で ID を確認することはできませんが、winget で未知のアプリをインストールする場面はないと思うのでよしとします。