我尝试使用WIX(3.10)创建MSI Single Package。用户可以在UI中选择包是应该安装Per-User还是Per-Machine。该软件包已使用ALLUSERS=2
和MSIINSTALLPERUSER=1
进行初始化。我没有设置InstallScope
,因为这会将Package限制为一个或另一个。
如果用户选择每台计算机,则设置将继续ALLUSERS=2
和MSIINSTALLPERUSER=""
。 - 一切都按预期工作。
如果用户选择每用户安装ALLUSERS=2
并且MSIINSTALLPERUSER=1
保持不变。如果非特权用户运行设置,一切都按预期工作。
但是,如果特权用户执行设置并选择每用户安装,则应写入HKCU\Software\Classes\
的注册表项仍写入{{ 1}} / HKCR
。没有调用UAC就会发生这种情况。
我在Windows 8.1(当前补丁级别)上观察到了这种行为。
这不是我想要的。如果用户选择每用户安装,则不应向HKLM / HKCR写入任何内容。
以下是来自wxs文件的示例:
HKLM\Software\Classes\
我用Orca检查了MSI。此<Component Id="MyRegistryComponent" Guid="{99999999-9999-9999-9999-999999999999}">
<RegistryValue Id="MyRegistryComponent_MainKey" Root="HKCU" Key="Software\Classes\myapp.myclass" Value="myapp.myclass.foo" Type="string" />
</Component>
在MSI的注册表中具有Root = 1。
我已经尝试/检查了:
RegistryValue
和ALLUSERS
属性
的确如上所述。MSIINSTALLPERUSER
ALLUSERS=""
- 无效。MSIINSTALLPERUSER=1
更改为Root="HKCU"
。
这导致MSI中的Root = -1,但我没有改变最终结果
安装后的结果。我在这里缺少什么? 这种行为可能是由以前的不完整(非)安装引起的吗?
答案 0 :(得分:1)
当你说&#34;这导致MSI中的Root = -1,但我没有在安装后改变最终结果。&#34;它不清楚你指的是哪个结果,但是:
HKCU将永远前往HKCU,HKMU是您在单一套餐设置中在HKCU和HKLM之间切换所需的。因此,使用HKMU并生成详细日志将有助于查看其中某处是否存在故障。
您将在HKCR获得更改。这通常是正常行为,因为正如本文所解释的那样:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724475(v=vs.85).aspx
引用&#34; HKEY_LOCAL_MACHINE \ Software \ Classes键包含可应用于本地计算机上所有用户的默认设置。 HKEY_CURRENT_USER \ Software \ Classes键包含仅适用于交互式用户的设置。 HKEY_CLASSES_ROOT键提供了合并来自这两个源的信息的注册表视图。 HKEY_CLASSES_ROOT还为为以前版本的Windows设计的应用程序提供此合并视图。&#34;
HKCR是一个虚拟视图,它将当前用户的类注册与机器的类注册相结合,以显示系统上所有类条目的视图。其他帐户(例如系统帐户)只能看到HKLM,所以你看到的确切取决于你是谁。
我建议这里需要的是一个根据需要使用HKMU的测试用例,并且可能发布该测试用例。请记住,通过文档查看HKCR条目是正常的,所以也许这可以解释您所看到的一切。