我有这个产品,使用 WiX 3.11 构建。它包括一项服务(请注意,不涉及命名问题”,例如here或here):
<Component Id="fetcher_90_service_wrapper" Guid="ee31673b-1695-463c-896a-ef737ee206b8">
<File Id="acme_fetcher_9_0_service.exe" Source="acme-wrapper\acme-fetcher-9_0-service.exe" DiskId='2' KeyPath='yes'/>
<ServiceInstall ErrorControl='normal'
Name='acme-fetcher-9_0'
DisplayName="Acme 9.0 Fetcher"
Start='auto'
Type='ownProcess'
Account='NT Service\acme-fetcher-9_0'>
<util:ServiceConfig
FirstFailureActionType='restart'
SecondFailureActionType='restart'
ThirdFailureActionType='restart'
RestartServiceDelayInSeconds='30'
ResetPeriodInDays='1'/>
</ServiceInstall>
<ServiceControl Id="Fetcher90StartService" Start="install" Stop="both" Remove="uninstall" Name="acme-fetcher-9_0" Wait="yes"/>
</Component>
WiX 出于某种原因决定(请参阅我的问题此处)“按用户”安装此版本。我确实没有那样配置它,因为我刚刚了解到这是一件需要注意的事情。安装程序已发货,以上操作无法撤消。
现在我想升级此安装,目前正在尝试使用 WiX 4.0.3。服务本身没有变化。但 WiX 决定升级安装程序现在“每台机器”安装 - 由于此限制,它无法实际升级(除了现有版本之外,它还安装新版本):
如果应用程序安装在每用户安装上下文中,则应用程序的任何主要升级也必须使用每用户上下文执行。如果应用程序安装在每台计算机安装上下文中,则该应用程序的任何主要升级也必须使用每台计算机上下文执行。 Windows Installer 不会跨安装上下文安装主要升级。
因此我再次手动设置要为每个用户安装的 Package 元素。但这个安装程序甚至没有完成,因为“每用户”安装在没有“提升权限”的情况下自动运行(我也尝试过
perUserOrMachine
),这不允许我停止服务(即使是我的“自己的”服务):
实际工作原理:从管理命令启动安装程序 - 这对我们的客户来说似乎有点麻烦。所以我寻找一种方法来强制 WiX 4“每用户”安装以特权运行 - 毕竟,上面提到的文档是这样的
将程序包的 InstallPrivileges 属性设置为“受限”。
,所以我只是覆盖
InstallPrivileges
,对吧?不,因为该属性不仅不再记录,而且“被消除”。由于 Windows 决定删除 “以管理员身份运行”:WiX 升级以前安装的“每用户”产品的方式是什么?
WiX v3 中的默认安装范围是每个用户。 WiX v3 模板都设置了 Package/@InstallScope='perMachine'。根据反馈,WiX v4 中的默认设置已更改为每台机器。
每个用户的提升是一个非常奇怪的组合。如果 WiX v4 阻止这种无意义的配置来避免此类问题,我不会感到惊讶。
Windows Installer 在这种情况下无法提供太多帮助。我想我可能会发布一个适当的每台机器包,并添加一个自定义操作来检测何时从每用户升级并强制该包为每用户。这延续了奇怪的每用户软件包安装到每台计算机位置的行为,但最大限度地减少了对最终用户的影响。