Как прочитать определенный раздел реестра из Wix управляемого загрузчика или пользовательского действия? - PullRequest
0 голосов
/ 05 сентября 2018

У меня проблемы с чтением этого ключа из моего управляемого загрузчика (.NET 4.5.2) и моего пользовательского действия (пробовал .NET 2.0 и 4.0).

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages

Я попытался запустить загрузчик и MSI, используя cmd в качестве администратора. Моя тестовая среда - Windows 7 64-bit. Я использую Wix 3.11

Я создал тестовое приложение командной строки и смог получить доступ к этому ключу.

Код тестирования, который я использовал в загрузчике и настраиваемом действии:

static RegistryKey GetHKLMKey(string registryPath) {
    var hklm64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
    var registryKey64 = hklm64.OpenSubKey(registryPath);
    if ((registryKey64?.GetValueNames().Any()).GetValueOrDefault()) {
        return registryKey64;
    }

    var hklm32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
        return hklm32.OpenSubKey(registryPath);
    }
}
...
var path = @"SOFTWARE";

foreach (var segment in @"Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages".Split('\\')) {
    path += "\\"+segment;

    var j = GetHKLMKey(path);
    Log(path + ": " + j);

    var k = Registry.LocalMachine.OpenSubKey(path);
    Log(path + ": " + k);
    if (k == null) return true;
}

тестовый вывод

SOFTWARE\Microsoft: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
SOFTWARE\Microsoft: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
SOFTWARE\Microsoft\Windows: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
SOFTWARE\Microsoft\Windows: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
SOFTWARE\Microsoft\Windows\CurrentVersion: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
SOFTWARE\Microsoft\Windows\CurrentVersion: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing
SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing
SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages: 
SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages: 

1 Ответ

0 голосов
/ 05 сентября 2018

Отладка настраиваемых действий управляемого кода : Не совсем понятно, в чем проблема? Чтение не работает как пользовательское действие? Попробуйте отобразить окно сообщения из настраиваемого действия, а затем присоедините отладчик к процессу rundll32.exe, выполняющему управляемый код. Затем вы можете пройтись по коду с помощью Visual Studio обычным способом «отладки». Вот хорошее видео из Advanced Installer , показывающее, как это сделать: Отладка C # Пользовательские действия .

Чтение реестра : Если у вас есть возможность отладки, у вас должна быть возможность выяснить причину проблемы, с которой вы сталкиваетесь.

  • Подавленное исключение : Может быть, исключение какого-то рода происходит, и вы установили проверку ошибок для настраиваемого действия на "ignore exit code "
  • Битность : Наиболее распространенная проблема, по-видимому, "битность" (32-битная или 64-битная) - другими словами, вы читаете неправильно местоположение реестра, но я не думаю, что это проблема, которую вы видите.
  • Нарушение прав доступа? : Может также случиться так, что вы запускаете что-то, требующее прав администратора из последовательности графического интерфейса пользователя, прежде чем установка переходит в права администратора. Это может вызвать исключение прав доступа.

Просто некоторые идеи с моей головы. Пожалуйста, дайте нам знать, что это было.

...