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

时间:2017-05-18 21:01:40

标签: installation wix windows-installer installer burn

我正在使用托管引导程序应用程序构建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安装在每台计算机上,因此刻录尝试将其缓存在C:\ProgramData\Package Cache(每台计算机缓存)而不是%LocalAppData%\Package Cache(每用户缓存)中。这有两个问题:

  1. C:\ProgramData\Package Cache是每台计算机的位置,需要提升权限。由于我们始终缓存此新包,因此用户始终需要提升权限才能安装。
  2. 在安装过程中,不会弹出请求提升权限的UAC对话框。相反,安装程序失败,因为它被拒绝访问C:\ProgramData\Package Cache。以管理员身份运行是一种解决方法。
  3. 我怀疑#2是一个刻录错误,因为它应该要求获得访问每台计算机缓存的权限。我的问题是,我可以缓存到自定义位置吗?是否可以强制刻录将每台计算机程序包缓存到每个用户文件夹?我没有看到任何配置选项。

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

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,所以我想我会在这里发布一个答案供其他人查找。我最终通过按需下载选项包而不是缓存它来解决缓存问题。只需设置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进行了磋商,并了解了上述其他一些问题的答案:

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