如何从 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 序列的管理员权限在设置提升到管理员权限之前。这可能会触发访问权限异常。
只是我的一些想法。请让我们知道它是什么。
我无法从我的托管引导程序 (.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 序列的管理员权限在设置提升到管理员权限之前。这可能会触发访问权限异常。
只是我的一些想法。请让我们知道它是什么。