とある先輩に「Windows Store のアプリ一覧を取得したいんだけど、やり方知らない?」と聞かれたのでやってみました。今回は、その方法と簡単な実装のメモの回。
最初から答えを授かりました
2 分ほど iPhone で調べて PowerShell コマンドで最低限できそうというところまでは当たりをつけていたのですが、C# から PowerShell コマンドを呼び出すのではない方法がいいなーと思っていました。と思っていたら C# MVP の大先輩である @matarillo さんがパッと答えを教えてくださいました!本当に感謝!
WMIから一覧をとってきて調べるとか?https://t.co/JFQFtiQruT https://t.co/McVM56cYz2
— Kentaro Inomata (@matarillo) August 27, 2019
どうやら WMI (= Windows Management Instrumentation) という OS 管理の機能/技術を使えばできるみたいです。
実装
LINQPad で書いてみたのですが、ザッと以下のような感じで取得できました。WQL なるクエリ言語で書いて投げるだけの簡単なお仕事でした。ちなみに実行には管理者権限が必要です。
void Main() { WindowsStoreApp.GetInstalled().Dump(); } public sealed class WindowsStoreApp { public string Architecture { get; } public string Language { get; } public string Name { get; } public string ProgramId { get; } public string Vendor { get; } public Version Version { get; } private WindowsStoreApp(PropertyDataCollection props) { this.Architecture = (string)props[nameof(Architecture)].Value; this.Language = (string)props[nameof(Language)].Value; this.Name = (string)props[nameof(Name)].Value; this.ProgramId = (string)props[nameof(ProgramId)].Value; this.Vendor = (string)props[nameof(Vendor)].Value; this.Version = Version.Parse((string)props[nameof(Version)].Value); } public static WindowsStoreApp[] GetInstalled() { // これで取り出せちゃう!簡単! const string wql = "select * from Win32_InstalledStoreProgram"; using (var searcher = new ManagementObjectSearcher(wql)) { return searcher .Get() .Cast<ManagementBaseObject>() .Select(x => x.Properties) .Select(x => new WindowsStoreApp(x)) .ToArray(); } } }
手元の環境では結果は以下のようになっていて、この Name
や ProgramId
から所望のアプリがインストール済みかを判定できそうです。
Microsoft Office の Application ID
例えば Microsoft Office の Windows Store 版が入っているかは、以下のサイトにある Application ID を参考にすると判定できるような気がしています。「気がしている」というのは、僕が Office 365 を契約していないので Windows Store 版をインストールできていないから、なだけなのです...(悪しからず