potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C# Windows 10のレジストリを直接参照して実行ファイル名の登録されたAppIDとその名前を取得するコード

動作確認環境:Windows 10、C#、.NET Core 3.1

レジストリを直接参照して実行ファイル名の登録されたAppIDとその名前を取得するコードです。

using System;
using System.Collections.Generic;
using Microsoft.Win32;

class Program
{
    static void Main()
    {
        var exeNameAndAppId = GetRegistedExeNamesForAppID();
        foreach ((string exeName, Guid appId) in exeNameAndAppId)
        {
            Console.WriteLine($"{exeName}: {appId.ToString("B")}");
        }
        // ...
        // rundll32.exe: {de5d803e-5d2a-4b5f-9c63-af25a465cc44}
        // ...
    }

    static Dictionary<string, Guid> GetRegistedExeNamesForAppID()
    {
        using var hkcr = RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry64);
        using var appIdsKey = hkcr.OpenSubKey("AppID");

        var exeNameAndAppId = new Dictionary<string, Guid>();
        foreach (var appName in appIdsKey.GetSubKeyNames())
        {
            using var appIdKey = appIdsKey.OpenSubKey(appName);
            if (Guid.TryParseExact((string)appIdKey.GetValue("AppID", null), "B", out var guid))
            {
                exeNameAndAppId.Add(appName, guid);
            }
        }
        return exeNameAndAppId;
    }
}

AppIDレジストリキーの構造は以下を参照です。