使用 WIX 工具集下载和复制文件

Downloading and copying file using the WIX toolset

我正在努力为我们基于 WIX 的安装程序添加一项功能。这是我第一次使用 WIX,所以对我来说都是全新的。

我想做的是允许用户在使用 msiexec.

时传递身份验证令牌命令行参数

然后安装程序将使用授权令牌进行 API 调用。如果身份验证失败,安装程序将终止。否则,安装程序将使用 API 下载文件并将其复制到安装目录(很可能在 Program Files 下)。

我已经设法在 WIX 中读取命令行参数作为属性,并在 C# 中创建了一个 CustomAction 来处理身份验证/下载文件。

我遇到的问题是让 CustomAction 将文件复制到安装位置,因为它没有写入该位置的权限。

我可以通过设置 execute="deffered""impersonate=no 以更高的权限拥有它 运行 但是这会阻止我从 session 对象中读取属性。

另一种可能的选择是将文件保存到 CustomAction 中的一个临时位置(无需提升权限即可工作)并设置一个新的 属性。然后我可以使用 CopyFile 组件和 SourceProperty 将该文件复制到目标位置。

但是,我无法弄清楚如何在 CopyFile 组件之前将 CustomAction 设置为 运行,因为 属性 直到CustomAction 已 运行。它是简单地 运行 宁 运行 宁 CustomAction before 安装的特定部分,还是还有更多?

您仍然可以在延迟的自定义操作期间从会话对象中读取属性,您只需要将在命令行中传入的 public 属性 定义为 Secure="yes" 然后进行在延迟自定义操作之前 运行 的第二个自定义操作,用于为延迟操作设置 CustomActionData 属性,以便它可以在执行期间读取 public 属性 的值.

你需要这样定义

<Property Id="AUTHTOKEN" Secure="yes" Hidden="yes" />

<CustomAction Id="AuthenticateDownload" BinaryKey="CustomActionsDLL" DllEntry="Download" Execute="Deferred" Impersonate="no" />
<CustomAction Id="SetAuthenticateDownload" Property="AuthenticateDownload" Value="AUTHTOKEN=[AUTHTOKEN];INSTALLDIR=[INSTALLDIR]" />

<InstallExecuteSequence>
    <Custom Action="SetAuthenticateDownload" Before="AuthenticateDownload">NOT Installed AND NOT UPGRADINGPRODUCTCODE AND NOT REMOVE~="ALL"</Custom>
    <Custom Action="AuthenticateDownload" Before="InstallFiles">NOT Installed AND NOT UPGRADINGPRODUCTCODE AND NOT REMOVE~="ALL"</Custom>
</InstallExecuteSequence>

要在自定义操作中访问您传入的 属性 值,您现在需要使用

string AuthToken = session.CustomActionData["AUTHTOKEN"];
string InstallDir = session.CustomActionData["INSTALLDIR"];

... try download to installdir ...

将属性传递给延迟操作需要考虑的几件事是,您必须使用 "Set" 操作,该操作使用您想要的 CustomAction 的 ID 的确切名称设置 属性在其中使用它。然后使用以逗号分隔的 PropertyName=PropertyValue 列表,其格式意味着您可以使用 [] 中的安装程序属性作为值。

仅当您在机器上安装新产品(不是升级或删除)时,自定义操作的条件才会允许此自定义操作 运行。如果您只想在第一次安装时执行 运行 而不是升级时的操作,只需在其中添加 AND NOT WIX_UPGRADE_DETECTED

不要忘记添加相反的自定义操作以在卸载时删除这些文件,这样您就不会遗漏任何东西。