xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

C# でインストールされている Windows Store App の一覧を取得する

とある先輩に「Windows Store のアプリ一覧を取得したいんだけど、やり方知らない?」と聞かれたのでやってみました。今回は、その方法と簡単な実装のメモの回。

最初から答えを授かりました

2 分ほど iPhone で調べて PowerShell コマンドで最低限できそうというところまでは当たりをつけていたのですが、C# から PowerShell コマンドを呼び出すのではない方法がいいなーと思っていました。と思っていたら C# MVP の大先輩である @matarillo さんがパッと答えを教えてくださいました!本当に感謝!

どうやら 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();
        }
    }
}

手元の環境では結果は以下のようになっていて、この NameProgramId から所望のアプリがインストール済みかを判定できそうです。

f:id:xin9le:20190828023330p:plain

Microsoft Office の Application ID

例えば Microsoft Office の Windows Store 版が入っているかは、以下のサイトにある Application ID を参考にすると判定できるような気がしています。「気がしている」というのは、僕が Office 365 を契約していないので Windows Store 版をインストールできていないから、なだけなのです...(悪しからず