【发布时间】: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 是烧录错误,因为它应该请求访问每台计算机缓存的权限。我的问题是,我可以缓存到自定义位置吗?是否可以强制刻录将每台机器的包缓存到每用户文件夹?我没有看到任何配置选项可以这样做。
我试图在这里提供一些上下文,以防有更好的方法来做到这一点。我的总体目标是允许用户通过第一次安装时跳过的修改来安装软件包。如果有更好的方法,请告诉我。
【问题讨论】:
标签: wix windows-installer installation burn