如何从 Wix 管理的引导程序或自定义操作中读取某些注册表项?

How to read certain registry key from Wix managed bootstrapper or custom action?

我无法从我的托管引导程序 (.NET 4.5.2) 和我的自定义操作(尝试过 .NET 2.0 和 4.0)读取此密钥。

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

我以管理员身份使用 cmd 尝试了 运行 引导程序和 msi。我的测试环境是Windows7 64位。我正在使用 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: 

调试托管代码自定义操作:不太清楚问题出在哪里?读取不能用作自定义操作?尝试显示来自自定义操作的消息框,然后将调试器附加到 rundll32.exe 进程 运行 托管代码。然后您可以在正常 "debug fashion" 中使用 Visual Studio 单步执行代码。这是来自 Advanced Installer showing you how to do this: Debug C# Custom Actions.

的精彩视频

Registry Read:一旦具备可调试性,就应该可以找出问题的原因你看到了。

  • Suppressed Exception:也许发生了某种 exception 而你有将自定义操作的错误检查设置为“ignore exit code”?
  • Bitness:最常见的问题似乎是 "bitness" (32-bit vs 64-bit) - 换句话说,您读错了注册表位置,但我认为这不是您遇到的问题。
  • 访问冲突?:也可能是您 运行 需要 GUI 序列的管理员权限在设置提升到管理员权限之前。这可能会触发访问权限异常。

只是我的一些想法。请让我们知道它是什么。