WiX 安装程序:修改安装以包括在初始安装时跳过的包

Posted

技术标签:

【中文标题】WiX 安装程序:修改安装以包括在初始安装时跳过的包【英文标题】:WiX Installer: Modify installation to include package skipped on initial installation 【发布时间】:2017-05-18 21:01:40 【问题描述】:

我正在构建一个带有托管引导程序应用程序的 WiX 捆绑安装程序。最近,我添加了一个新的MsiPackage,它会在每台机器上安装,但只有在用户通过复选框选择加入时才会安装。用户可以稍后从程序和功能中修改安装以安装此软件包。这是捆绑包中唯一的每台机器包。其余的是每个用户。允许在没有提升权限的情况下进行安装对我们来说至关重要,这就是为什么这个每机器包是可选的。在修改期间请求提升的权限很好。

最初,我是这样配置新包的:

<MsiPackage Id="optional_package"
            Cache="yes" Compressed="yes" Visible="no"
            DisplayInternalUI="no"
            SourceFile="..\Resources\OptionalPackage.msi" />

这个配置的问题是,如果包在第一次安装包时没有安装,它不会被缓存(Cache="yes" 只在包被安装时缓存)。如果用户随后尝试修改安装以安装此包,则该操作将失败,因为刻录无法找到 OptionalPackage.msi 的源。我可以通过请求始终缓存包来解决这个问题:

<MsiPackage Id="optional_package"
            Cache="always" Compressed="yes" Visible="no"
            DisplayInternalUI="no"
            SourceFile="..\Resources\OptionalPackage.msi" />

这解决了第一个问题,但产生了一个新问题。由于 OptionalPackage.msi 是按机器安装的,burn 会尝试将其缓存在 C:\ProgramData\Package Cache(每台机器缓存)而不是 %LocalAppData%\Package Cache(每用户缓存)中。这样做有两个问题:

    C:\ProgramData\Package Cache 是每台机器的位置,需要提升的权限。由于我们总是缓存这个新包,因此用户总是需要提升权限才能安装。 在安装过程中,不会弹出请求提升权限的 UAC 对话框。相反,安装程序失败,因为它被拒绝访问C:\ProgramData\Package Cache。以管理员身份运行是一种解决方法。

我怀疑 #2 是烧录错误,因为它应该请求访问每台计算机缓存的权限。我的问题是,我可以缓存到自定义位置吗?是否可以强制刻录将每台机器的包缓存到每用户文件夹?我没有看到任何配置选项可以这样做。

我试图在这里提供一些上下文,以防有更好的方法来做到这一点。我的总体目标是允许用户通过第一次安装时跳过的修改来安装软件包。如果有更好的方法,请告诉我。

【问题讨论】:

【参考方案1】:

我解决了这个问题,所以我想我会在这里发布一个答案供其他人查找。我最终通过按需下载选项包而不是缓存它来解决缓存问题。只需设置Compressed="no" 并设置DownloadUrl

<MsiPackage Id="optional_package"
            Cache="yes" Compressed="no" Visible="no"
            DisplayInternalUI="no"
            SourceFile="..\Resources\OptionalPackage.msi"
            DownloadUrl="https://example.com/download/OptionalPackage.msi" />

当需要安装包时,WiX 会自动下载。请记住,SourceFile 定义的文件和DownloadUrl 定义的文件必须完全匹配。 WiX 对SourceFile 进行哈希处理并将其存储在您的安装程序中。下载后,它会在DownloadUrl 处对文件进行哈希处理,并且只有在哈希匹配时才会安装它。

此解决方案并不理想,因为它需要内部连接,但没有其他方法可以满足我们的要求。我们的主要问题是这个 .msi 是一个机器包,我们的安装程序是按用户运行的。我们与 FireGiant 进行了协商,并了解了我上面其他几个问题的答案:

    无法为来自的包定义缓存位置 在安装程序中。这可以由系统在 Windows 中配置 用户本地机器的管理员,但不是由我们在我们的 安装程序。 在我描述的情况下,WiX 没有请求提升权限这一事实确实是一个烧毁的错误。

【讨论】:

以上是关于WiX 安装程序:修改安装以包括在初始安装时跳过的包的主要内容,如果未能解决你的问题,请参考以下文章

如果已安装,则跳过 MSI

(WiX) 将产品信息写入注册表以用于双重用途安装程序

C#/ADO.NET - 在数据表中使用 SetField 时跳过的行?

为啥 IntelliJ 在远程调试时跳过断点

使用 WIA 2.0 和 C# 扫描多页时跳过的页面

如何设置 Wix 引导程序安装的产品代码