GetSubKeyNames не возвращает все ключи - программирование

GetSubKeyNames не возвращает все ключи

Я хочу, чтобы программное обеспечение было установлено на клиенте. Я также использую WMI и реестр.

Я нахожу большую часть информации в HKLM\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\UNINSTALL

Однако Dropbox, например, там не отображается. Dropbox находится под HKCU, поэтому я хочу также прочитать эти ключи. Простой, я думал, причина, что путь тот же, только изменения RegistryHive.

Проблема

Я не вижу ключа UNINSTALL, хотя, когда я в CurrentVersion, используя функцию GetSubKeyNames.

var root = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32)

var key = root.OpenSubKey(@"SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION") // works
var key = root.OpenSubKey(@"SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\Uninstall") // doesnt work

Также я попробовал это с RegistryView.Registry64 - я получаю тот же результат.

Что печатает, когда я использую GetSubKeyNames, следующее:

Device Metadata
Explorer
Group Policy
GrpConv
Internet Settings
Media Center
Run
Shell Extensions
Telephony
ThemeManager
WinTrust

Кто-нибудь знает, как я могу исправить эту проблему?

4b9b3361

Ответ 1

Я столкнулся с этой проблемой, проверяя работу 32-разрядных и 64-битных просмотров.

        var HKLM32 = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "computername", RegistryView.Registry32);
        var HKLM64 = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "computername", RegistryView.Registry64);
        key32 = HKLM32.OpenSubKey(registryKeytoFind);
        key64 = HKLM64.OpenSubKey(registryKeytoFind);

Ответ 2

Вы можете использовать: Registry.LocalMachine.OpenSubKey( "Ваш ключ здесь" ). GetSubKeyNames()

Но попробуйте изменить цель платформы как на x86, так и на x64. Вы увидите два разных результата.

Чтобы изменить цель платформы: Перейти к проекту → Свойства → Сборка → Цель платформы Попробуйте настроить это на X86, распечатать результаты. Затем установите значение x64, напечатайте результаты