【问题标题】:WIX MSI perMachine installer writing installed property to HKCU instead of HKLMWIX MSI perMachine 安装程序将已安装属性写入 HKCU 而不是 HKLM
【发布时间】:2023-04-10 23:36:01
【问题描述】:

WIX MSI perMachine 安装程序将已安装属性写入 HKCU 而不是 HKLM。

其中一个症状是我用来检测安装旧版本产品尝试的原始逻辑失败了,因为我依赖 Installed 属性在之前执行安装的系统上进行定义。为了清楚起见,这个逻辑在过去是有效的,但现在我正在做回归测试,但它失败了。

我用 orca 编辑了 msi,并修改了测试这个的启动条件。我将启动条件更改为“已安装”并将消息更改为“未安装”,然后在安装了我们的应用程序的几个系统上运行安装程序。如果 Installed 为真,则安装程序将运行,但在每种情况下,安装程序都会显示消息框,表示它找不到注册表项。

我查看了所有这些系统,“已安装”注册表项位于 HKCU/Software/company/product/installed=1 而不是 HKLM。

这也是一个 64 位安装程序,当我运行安装程序时,它会进入 UI,我查看任务管理器以确保它运行的是 64 位版本的 msiexec。

这是停止工作的相关 WIX 片段。见第一个发射条件。我正在添加 Product ... 部分的开头。

<Product Id="*"
 Name="$(var.ProductDisplayName)"
 Language="1033"
 Version="$(var.OurVersion)"
 Manufacturer="$(var.ProductAuthor)"
 UpgradeCode="$(var.ProductUpgradeCode)">
<Product Id="*"
 Name="$(var.ProductDisplayName)"
 Language="1033"
 Version="$(var.VayTekVersion)"
 Manufacturer="$(var.ProductAuthor)"
 UpgradeCode="$(var.ProductUpgradeCode)"
>

<Package
  Description="$(var.ProductDisplayName)"
  Comments="$(var.ProductDisplayComment)"
  Manufacturer="$(var.ProductAuthor)"
  InstallerVersion="301" Compressed="yes"
  Platform="$(var.Platform)"
  InstallScope="perMachine"
  InstallPrivileges="elevated"/>

<Upgrade Id="$(var.ProductUpgradeCode)">
<UpgradeVersion Minimum="$(var.OurVersion)"
    IncludeMinimum="no" 
    OnlyDetect="yes"   
    Property="NEWERPRODUCTFOUND" />
<UpgradeVersion
    Minimum="07.01.01001" IncludeMinimum="yes"
    Maximum="$(var.OurVersion)" IncludeMaximum="no"
    Property="PREVIOUSVERSIONSINSTALLED"/>
</Upgrade>

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallFinalize"/>
</InstallExecuteSequence>

<Condition 
    Message="A later version of the product is already installed. Setup  will now exit.">
    (NOT NEWERPRODUCTFOUND) OR (NOT Installed)
</Condition>

看了一会儿代码后,我删除了“未安装”逻辑并离开了

NOT NEWERPRODUCTFOUND

这并不理想,但它适用于大多数情况。

有人知道为什么注册表项被放置在错误的配置单元中吗?

【问题讨论】:

    标签: wix registry windows-installer


    【解决方案1】:

    当ALLUSERS 属性设置为“1”时,MSI 包是每台机器的。在 WiX 工具集中,您可以使用 Package 元素将其设置为 InstallScope 属性设置为“perMachine”。

    此外,升级不会检测到其他安装范围内的软件包。换句话说,每台机器不能升级每用户,反之亦然。

    PS:"NOT Installed" 中的 LaunchCondition 是一个非常奇怪的东西。那只会尝试阻止修复/卸载。

    【讨论】:

    • 我没有包括 wxs 中具有 InstallScope 定义但它设置为 perMachine 的部分,并且从几年前的早期开发开始就一直如此。
    • 感谢关于未安装的提示 - 我想这是在开发安装程序的早期出现的,我把它留在了。
    • 如果我已经设置了 InstallScope="perMachine" 为什么注册表项不能进入 HKLM 而不是我找到它的 HKCU?我可能正在做一些其他导致这种情况的行为。我最近添加了一些影响注册表的 Wow6432Node 部分的注册表项,因为我正在添加对我们的应用程序调用的仅限 32 位应用程序的支持。这会重定向注册表项的存储吗?
    • 这在很大程度上取决于该注册表项的编写方式。是 Root='HKCU' 吗?
    • 感谢您考虑这个问题,但恐怕我是这里的罪魁祸首。几年前,我在创建菜单快捷方式时添加了安装值条目,所以一切都在我身上。这次我的错误是认为 MSIEXEC 将条目放入注册表,但显然是我。我忘了。
    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多