1

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

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

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

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

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

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

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

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

4

1 回答 1

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在其中添加一个。

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

于 2017-08-01T15:14:12.553 回答