今回は、UWPアプリの基本情報を保持するAppxManifest.xmlを解析して、一連のUWP解析の最後としたい。さて、このAppxManifest.xmlだが、Appx自体、Windows 8のストアアプリ用に作られたものであるため、このxmlファイルもストアアプリの時代から存在しており、そのため、複雑な仕様を持つ。その仕様については、Microsoftのサイトに仕様書がある。
●Package manifest schema reference for Windows 10
https://docs.microsoft.com/ja-jp/uwp/schemas/appxpackage/uapmanifestschema/schema-root
それによれば、アプリの名前は<DisplayName>タグにあることになっているのだが、これとは別にタイル用の定義が<uap:VisualElements>にある。このAppxManifest.xmlを扱うときに注意するのは、XMLネームスペース(XML Namespace、xmlns)が使われていることだ。
<uap:VisualElements>の先頭の「uap:」という部分がXMLネームスペースで、簡単にいうと、タグに複数の定義があるときに、ネームスペースを付けることでそれぞれを区別するためのものだ。前回のようにselectNodes()とXPathを使う方法は、ネームスペースがあるとアクセスが面倒になる。
具体的には、ネームスペースをXMLNamespaceManagerというオブジェクトに設定して、これをXPathと併用してSelectNodes()を使う必要がある。XPathが使えると「なんでもいいから属性DisplayNameを持ってるタグ」といった指定が使えて簡単で、かつ、XMLファイルの構造変化にも対応しやすいのだが、今回は、それ以外の方法を使う。
まずは、実際にどうなっているのか調べる
xmlファイルとはいえテキストファイルなので、単に行を取り出す程度の調査は比較的簡単できる。UWPアプリがインストールされている「C:\Program Files\WindowsApps\」を管理者権限で起動したPowershellで開く。以下のコマンドで、そこにインストールされているアプリのAppxManifest.xmlファイルからすべての<VisualElements>タグを表示させることができる。select-stringでは検索パターンに正規表現が使える。
Select-String ".\*_x64_*\AppxManifest.xml" -Pattern '\<.*VisualElements.*DisplayName=' | Out-GridView
前述の仕様書上は、<uap:VisualElements>というタグになっているが、ネームスペースがないもの、あっても、“uap:”以外のものがある。
サードパーティのアプリならば、まあ、よしとしようが、ネームスペースがないアプリの1つは、こともあろうかマイクロソフト製である。
DisplayNameタグを取り出す
まずは、簡単な方法として<DisplayName>タグを表示させる。まずは、appxmainfest.xmlを変数に読み込む部分だが、こちらは、専用のコマンドGet-AppxPackageManifestがある。変数$Manifestに読み込むとしたら、
$Manifest = Get-AppxPackage "*Messaging*" | Get-AppxPackageManifest
とする。「*Messaging*」は、パッケージ名の一部を表す文字列だ。正確にパッケージ名を指定してもいいのだが、Get-AppxPackageの場合には、このようにワイルドカードを含んだ指定が可能。これに対して、Get-AppxPackageManifestは、正確にパッケージ名を指定する必要があるため、Get-AppxPackageコマンドが出力するオブジェクトをパイプで渡している。
これはXMLオブジェクトとして出力されるので、キャストは不要である。こうしてXMLファイルを$Manifest変数に読み込ませれば、前回解説したように、タグ名をピリオドでつないでいけば、タグの値を得ることができる。前述の<DisplayName>タグなら、
$Manifest.Package.Properties.DisplayName
とすればよい。
この方法は簡単で、PowerShellがXMLオブジェクトと認識している状態では、タブキーによるタグ名の補完なども使えるのだが、階層構造に依存する記述方法になる。このXMLをPowershellのオブジェクトとして扱う方法では、階層構造が変わると、アクセスができず、かといってエラーにもならず、何もないことを示すNULLを返す。このため、スクリプトなどで処理しようとすると、エラーにならないけど、答えも出ないといったものになってしまい、結構デバッグが面倒な状態になる。
仕様書を見る限り、この構造は変わらないようなので、正しく作られたAppxManifestであれば、これでアクセスができる、はずであるが、前述のようにルールに従っていないタグが使われているようなので、注意は必要だ。
●AppxManifest.xml DisplayNameタグ
https://docs.microsoft.com/ja-jp/uwp/schemas/appxpackage/uapmanifestschema/element-displayname
実際に<DisplayName>タグではどういう定義がされているのかを調べてみよう。Get-AppxPackageでインストールされているアプリを列挙し、Get-AppxPackageManifestで得たXMLオブジェクトに対して直接<DisplayName>タグを表示させてみる。
(Get-AppxPackage -PackageTypeFilter Main | Get-AppxPackageManifest).Package.Properties.DisplayName | Out-GridView
このコマンドの出力結果が、以下の画面だ。
これを見ると、大半は各国語にローカライズするために「ms-resource:」で始まるリソース指定になっているが、中には、英語名しか指定していないものや、直接日本語で名前が指定されているものもある。
特定のUWPアプリのAppxManifest.xmlが変数$Manifestに読み込まれているなら、
$Manifest.Package.Properties.DisplayName
とすることで、<DisplayName>タグの値を取り出すことが可能だ。
この連載の記事
-
第459回
PC
WSL 2.4.4ではtar形式でのディストリビューションが配布でき、企業での利用が容易になってきた -
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 -
第449回
PC
WSLはプレビュー版でGUIでの設定が加わった! リリース2.3.xの新機能を見る - この連載の一覧へ