【问题标题】:Downloading and copying file using the WIX toolset使用 WIX 工具集下载和复制文件
【发布时间】:2017-08-01 14:05:32
【问题描述】:

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

我正在尝试做的是允许用户在使用msiexec 时传递身份验证令牌命令行参数。

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

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

我正在努力的部分是让 CustomAction 将文件复制到安装位置,因为它没有写入该位置的权限。

我可以通过设置execute="deffered""impersonate=no 让它以提升的权限运行,但这会阻止我从session 对象中读取属性。

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

但是,我无法弄清楚如何让 CustomAction 在 CopyFile 组件之前运行,因为直到运行 CustomAction 之后才会设置该属性。是否像在安装的特定部分运行 CustomAction before 一样简单,还是还有更多?

【问题讨论】:

  • 它应该像在“MoveFiles”之前安排它一样简单(wixtoolset.org/documentation/manual/v3/xsd/wix/copyfile.html 提到了 DuplicateFiles 和 MoveFiles 表,我假设它在定义不引用 File 元素 ID 的 CopyFile 时使用 MoveFiles 表) 但我添加了一个答案,应该让您延迟运行自定义操作并将文件下载到安装目录。

标签: wix windows-installer wix3.9


【解决方案1】:

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

你需要定义这样的东西

<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 ...

将属性传递给延迟操作需要考虑的一些事项是,您必须使用“设置”操作,该操作使用您要使用的自定义操作 ID 的确切名称设置属性。然后您使用以逗号分隔的 PropertyName=PropertyValue 列表,该列表已格式化,这意味着您可以将 [] 中的安装程序属性用作值。

自定义操作的条件将让此自定义操作仅在您在计算机上安装新产品(而不是升级或删除)时运行。如果您只想在第一次安装而不是升级时运行该操作,只需在其中输入 AND NOT WIX_UPGRADE_DETECTED

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    相关资源
    最近更新 更多