1

マシンにインストールされたプログラムを読み取る方法を開発しようとしています。

public void refreshProgramsFromWindows () {
            string SoftwareKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\S-1-5-18\\Products";
            RegistryKey rk = default(RegistryKey);
            rk = Registry.LocalMachine.OpenSubKey(SoftwareKey);
            //string skname = null;
            string sname = string.Empty;

            // New list from scratch
            this.installedSoftwareList = new List<software>();

            // Object software info
            software aSoftware = new software();

            foreach (string skname in rk.GetSubKeyNames())
            {

                // Reset software info
                aSoftware.reset();

                try
                {
                    // Name of the programm
                    sname = Registry.LocalMachine.OpenSubKey(SoftwareKey).OpenSubKey(skname).OpenSubKey("InstallProperties").GetValue("DisplayName").ToString();
                    aSoftware.name = sname;

                    // Write program to the list
                    installedSoftwareList.Add(aSoftware);
                }
                catch (Exception ex)
                {

                }
            }

Net Framework は 4.5 で、私は Windows 7/8 を使用しています。このコードをデバッグすると、var rk が null になり、foreach で null 参照例外がスローされます。アプリ マニフェストは管理者権限を要求するように設定されているため、レジストリは読み取り可能です。何が問題ですか?

よろしくお願いします。乾杯。

4

1 に答える 1

4

64 ビット レジストリの問題:

追加 (64 ビット レジストリを処理するため):

public static RegistryKey GetRegistryKey()
        {
            return GetRegistryKey(null);
        }

        public static RegistryKey GetRegistryKey(string keyPath)
        {
            RegistryKey localMachineRegistry
                = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
                                          Environment.Is64BitOperatingSystem
                                              ? RegistryView.Registry64
                                              : RegistryView.Registry32);

            return string.IsNullOrEmpty(keyPath)
                ? localMachineRegistry
                : localMachineRegistry.OpenSubKey(keyPath);
        }

        public static object GetRegistryValue(string keyPath, string keyName)
        {
            RegistryKey registry = GetRegistryKey(keyPath);
            return registry.GetValue(keyName);
        }

そして変更:

rk = Registry.LocalMachine.OpenSubKey(SoftwareKey);

rk = GetRegistryKey(SoftwareKey);

そして今、それは機能します。

于 2013-04-22T02:35:49.790 に答える