1. トップ
  2. 新着ニュース
  3. IT
  4. IT総合

Windowsにおけるアプリ実行エイリアスとは?

ASCII.jp / 2023年3月26日 10時0分

Windowsにおける「アプリ実行エイリアス」とは UWPアプリなどを実行ファイル名で起動するための仕組み

 Windowsには、「アプリ実行エイリアス」という機能がある。これは、exe形式実行ファイルではないUWPアプリなどを、実行ファイル名で起動するための仕組みだ。UWPは特殊な方法で起動されるため、通常のexe実行ファイルのようにファイル名を指定して起動することができない。

 このアプリ実行エイリアスは、Microsoftストアで配布するためにMSIXを使ってパッケージ化されたWin32アプリ(デスクトップアプリ)の起動にも使われる。こちらは、実行ファイル名を使って起動は可能だが、パッケージのインストール先が、システムディレクトリ(C:\Program Files\WindowsApps)以下になり、ディレクトリのスキャンができない。

 さらにアップデートでパッケージ名が変わるなどの問題があり、直接実行ファイルパスを使わないようにアプリ実行エイリアスを使ってスタートメニューなどに登録される。なお、通常のexe形式実行ファイルの起動に関してはこの連載で以前扱った(「Windowsでプログラムを実行するルールをあらためて掘り下げる」、「Windowsにおけるプログラム実行ルールをさらに詳しく掘り下げる」)。

 UWPには、URI起動もあるが、アプリ実行エイリアスは、コマンドラインになるため、引数の指定が可能になるというメリットがある。

 アプリ実行エイリアスは、アプリケーションがインストール時に設定するもので、ユーザー固有のものになる。現在利用できるアプリ実行エイリアスは、「設定」→「アプリ」→「アプリの詳細設定」→「アプリ実行エイリアス」で見ることができる。

アプリ実行エイリアスは、「設定」→「アプリ」→「アプリの詳細設定」→「アプリ実行エイリアス」で表示できる。これは、ユーザーがMicrosoftストアからインストールしたアプリが登録するものだ

 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なら、

として、情報を出力できる。

アプリ実行エイリアスは、NTFSの再解析ポイントを使って実現されている。これは、fsutil.exeを使ってダンプさせることができる。ただし、データ構造などについては未公開になっている

 このコマンドの出力で戦闘にある「再解析タグ値」が再解析ポイントタグで、「タグ値: 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ストア経由なので一応のセキュリティはあるが、何が実行されるのかわからないと不安になる。今回解説した方法を使えば、どこにあるプログラムが起動するのかが明確になり、少しは安心できるはずだ。

この記事に関連するニュース

トピックスRSS

ランキング

記事ミッション中・・・

10秒滞在

記事にリアクションする

記事ミッション中・・・

10秒滞在

記事にリアクションする

デイリー: 参加する
ウィークリー: 参加する
マンスリー: 参加する
10秒滞在

記事にリアクションする

次の記事を探す

エラーが発生しました

ページを再読み込みして
ください