Windowsにおける「アプリ実行エイリアス」とは
UWPアプリなどを実行ファイル名で起動するための仕組み
Windowsには、「アプリ実行エイリアス」という機能がある。これは、exe形式実行ファイルではないUWPアプリなどを、実行ファイル名で起動するための仕組みだ。UWPは特殊な方法で起動されるため、通常のexe実行ファイルのようにファイル名を指定して起動することができない。
このアプリ実行エイリアスは、Microsoftストアで配布するためにMSIXを使ってパッケージ化されたWin32アプリ(デスクトップアプリ)の起動にも使われる。こちらは、実行ファイル名を使って起動は可能だが、パッケージのインストール先が、システムディレクトリ(C:\Program Files\WindowsApps)以下になり、ディレクトリのスキャンができない。
さらにアップデートでパッケージ名が変わるなどの問題があり、直接実行ファイルパスを使わないようにアプリ実行エイリアスを使ってスタートメニューなどに登録される。なお、通常のexe形式実行ファイルの起動に関してはこの連載で以前扱った(「Windowsでプログラムを実行するルールをあらためて掘り下げる」、「Windowsにおけるプログラム実行ルールをさらに詳しく掘り下げる」)。
UWPには、URI起動もあるが、アプリ実行エイリアスは、コマンドラインになるため、引数の指定が可能になるというメリットがある。
アプリ実行エイリアスは、アプリケーションがインストール時に設定するもので、ユーザー固有のものになる。現在利用できるアプリ実行エイリアスは、「設定」→「アプリ」→「アプリの詳細設定」→「アプリ実行エイリアス」で見ることができる。
Windows 11標準のTerminalや新メディアプレーヤー、ペイント、wsl.exe、メモ帳、Teamsなどが、アプリ実行エイリアスで起動されている。また、wingetもアプリ実行エイリアスだ。
各ユーザーのアプリ実行エイリアスは、ユーザーフォルダの下にある「%LOCALAPPDATA%\Microsoft\WindowsApps」フォルダの下に登録されている。これは、where.exeを使っても調べることができる。たとえば、ペイント(mspaint.exe)なら、
where.exe mspaint.exe
とすれば、アプリ実行エイリアスの場所を調べられる。

Windows 11標準のペイント(mspaint.exe)もアプリ実行エイリアスで実現されており、where.exeコマンドを使うことで、実行パスとなるユーザーフォルダ下のmapaint.exeのパスを表示できる。これがアプリ実行エイリアスだが、powershellのdirコマンドではリンク先を表示することができない
なお、PowerShellで「where」は、Where-Objectのエイリアスなので「where.exe」と表記する必要がある。また、where.exeは、アプリ起動エイリアスのプログラムに対して、2つのファイルパスを表示することがある。このうち1つがユーザーフォルダ以下のアプリ実行エイリアスのパスで、もう1つはそのリンク先となるパスのようである。2つを表示する条件がはっきりしないが、PowerShellなどのセッションごとに異なるため、キャッシュなどの問題ではないかと思われる。
アプリ実行エイリアスは
NTFSの再解析ポイントと呼ばれる機能で実現されている
このアプリ実行エイリアスは、NTFSの再解析ポイント(Reparse Point)と呼ばれる機能を使って実現されている。再解析ポイントとは、NTFSのファイルシステムオブジェクトの一種で、ファイル情報内に記録されたタグとデータを使って、ファイルシステム・フィルタードライバーがこれを解釈してさまざまな機能を実現している。たとえば、シンボリックリンクやディレクトリジャンクション、OneDriveの同期ファイルなどがこれを使う。
再解析ポイントは、すべてのファイルに存在しているわけではなく、また「拡張属性」とは同じ場所を記録に使うために排他的な関係にある。ファイルやディレクトリが再解析ポイントを持っている場合、fsutil.exeでこれを表示させることができる。「%LOCALAPPDATA%\Microsoft\WindowsApps」フォルダにあるexeファイルに対して、
fsutil.exe reparsepoint query <パス>
とすることで、再解析ポイントデータを表示できる。Windows 11付属のWindows Terminalなら、
として、情報を出力できる。
このコマンドの出力で戦闘にある「再解析タグ値」が再解析ポイントタグで、「タグ値: Microsoft」は、このタグがマイクロソフトが定義したシステム用タグであることを示す。再解析タグ値は、「ポイント タグを再解析する」(https://learn.microsoft.com/ja-jp/windows/win32/fileio/reparse-point-tags)にあるように32bit整数値で、最上位ビットがマイクロソフト定義のタグを示す。このタグは、Windows SDKに含まれているWinNT.hで、定義されている「IO_REPARSE_TAG_APPEXECLINK」である。
再解析ポイントの情報は、Win32APIでファイルシステムドライバーにIOCTRLコードを送って入手することもできるのだが、プログラムを作るのがかなり面倒だ。そこで、fsutil.exeの出力を加工して取り出すことにした。
データはUnicode文字列で、区切りは0x0000である。ただし、fsutilの出力は文字列なので、不要な部分を外して、16進ダンプ部分を取り出して加工し、文字列の配列として、バイト配列に変換したのちに文字列化してある。以下は、そのためのコマンドである。

fsutil.exeの出力を見ると、0x0000を区切りとしたユニコード文字列からなっているように見える。そこでPowerShellで16進ダンプ部分をデコードして文字列化してみた。すると4行目のデータがどうも実行ファイルのパスを示しているようだ
"$env:LOCALAPPDATA\Microsoft\WindowsApps\wt.exe"|%{[System.Text.Encoding]::Unicode.GetString(((fsutil.exe reparsepoint query $_ | select -Skip 5 | %{ $_.Substring(7,50) -replace " "," " } ) -join '' -replace " 00 00 00"," 00 0a 00" -split ' ' -ne '' | %{ [int]::Parse($_,"HexNumber") } )) -split "`n"}
これはfsutil.exeの出力形式に依存しているため、表示方法が変わると対応できなくなる可能性があり、アプリ実行エイリアスの再解析ポイントのデータ構造も変わってしまう可能性がある。今後のWindowsのアップデート後には、使えない可能性もある点は了承いただきたい。
なお、先頭の文字列にあるexeファイル名を変更することで他のプログラムの再解析ポイントデータも出力させることができる。フォルダのファイルすべてを調べるなら、「wt.exe」を「*.exe」として、行頭に「Get-ChildItem -Recurse -Path」を付ける。
これを使うと、Windows 11付属のTerminal(プレビュー版でない)は、以下のフォルダーに実行ファイルが存在することがわかる(原稿執筆時点の安定版v1.16.1026の場合)。
C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.16.10262.0_x64__8wekyb3d8bbwe\wt.exe
「C:\Program Files\WindowsApps」は、システムディレクトリなので、コマンドラインのdirコマンドやエクスプローラーで直接開くことはできないが、その下にあるパッケージフォルダを指定すれば開くことが可能だ。
アプリ実行エイリアスをスクリプトなどから利用する場合には、ユーザーフォルダー下の「%LOCALAPPDATA%\Microsoft\WindowsApps」にあるexeファイルのパスを指定するか、前記のコマンドで得られたexeファイルのパスを指定する必要がある。
ただし後者を使うと、設定のアプリ実行エイリアスでの指定は無視される。また、アップデートなどでパッケージ名が変わり、パスが無効になる。これは、パッケージ名にバージョン番号が含まれるからだ。Microsoftストアからインストールしたアプリケーションに関しては自動的にアップデートされ、ユーザーがそれを禁止することはできない。なので、パッケージのインストールパスを使った起動は、スクリプトなどに入れても無効になってしまう。これを追いかけるなら、再解析ポイントを解析して実行先を調べるしかない。
アプリ実行エイリアスは、コマンドラインなどで利用可能なものの、PATH変数の指定も不要勝手にWindowsが起動する。アプリ実行エイリアスは、再解析ポイントなので「どのプログラム」が動いているのかがユーザーには見えにくい。Microsoftストア経由なので一応のセキュリティはあるが、何が実行されるのかわからないと不安になる。今回解説した方法を使えば、どこにあるプログラムが起動するのかが明確になり、少しは安心できるはずだ。

この連載の記事
-
第472回
PC
WindowsのエラーをMicrosoftに送信するテレメトリ機能を理解する -
第471回
PC
Windowsのコマンドラインでエイリアスを使う -
第470回
PC
Windows用のパッケージマネージャー「Winget」 プレビュー版で機能が充実してきた -
第469回
PC
Windows Updateの27年 悪役だった頃から改良が進んで、徐々に目立たない存在に -
第468回
PC
2025年のWindowsどうなる!? Windows Insider Programの状況をあらためて見る -
第467回
PC
Copilot+ PCのNPUでカメラを処理する「Windows Studio Effects」 その内容や効果は? -
第466回
PC
PowerToysの最近の新機能には、複数アプリを指定位置に起動する「ワークスペース」や新規作成のカスタマイズがある -
第465回
PC
WindowsのPowerShellからBluetoothデバイスを調べる -
第464回
PC
Windows 10のサポート切れまで1年を切った さてWindows 10マシンをどうする? -
第463回
PC
Windows Terminal Preview版でSixelグラフィックスを実際に表示させてみる -
第462回
PC
Windows Terminal Preview版でSixelグラフィックスを扱う - この連載の一覧へ