尽管MSIINSTALLPERUSER = 1

时间:2016-09-18 21:54:50

标签: wix windows-installer

我尝试使用WIX(3.10)创建MSI Single Package。用户可以在UI中选择包是应该安装Per-User还是Per-Machine。该软件包已使用ALLUSERS=2MSIINSTALLPERUSER=1进行初始化。我没有设置InstallScope,因为这会将Package限制为一个或另一个。

如果用户选择每台计算机,则设置将继续ALLUSERS=2MSIINSTALLPERUSER=""。 - 一切都按预期工作。

如果用户选择每用户安装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。

我已经尝试/检查了:

  • 我验证了RegistryValueALLUSERS属性 的确如上所述。
  • 我尝试设置MSIINSTALLPERUSER ALLUSERS="" - 无效。
  • 我在wxs中将MSIINSTALLPERUSER=1更改为Root="HKCU"。 这导致MSI中的Root = -1,但我没有改变最终结果 安装后的结果。

我在这里缺少什么? 这种行为可能是由以前的不完整(非)安装引起的吗?

1 个答案:

答案 0 :(得分:1)

当你说&#34;这导致MSI中的Root = -1,但我没有在安装后改变最终结果。&#34;它不清楚你指的是哪个结果,但是:

  1. HKCU将永远前往HKCU,HKMU是您在单一套餐设置中在HKCU和HKLM之间切换所需的。因此,使用HKMU并生成详细日志将有助于查看其中某处是否存在故障。

  2. 您将在HKCR获得更改。这通常是正常行为,因为正如本文所解释的那样:

  3. 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条目是正常的,所以也许这可以解释您所看到的一切。