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

问题描述:

我正在为基于WIX的安装程序添加功能。这是我第一次使用WIX,所以这对我来说都很新颖。使用WIX工具集下载和复制文件

我想要做的是允许用户在使用msiexec时传递auth令牌命令行参数。

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

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

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

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

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

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

+1

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

您仍然可以在延迟自定义操作期间读取会话对象中的属性,您只需在命令行上将传入的公共属性定义为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 ... 

你需要有几件事情的自定义操作中考虑将属性传递给延迟操作的方法是,您必须使用“设置”操作,该操作设置了您想要使用的CustomAction的ID的EXACT名称的属性。然后,使用以逗号分隔的PropertyName = PropertyValue这是可以使用的格式[]中的安装程序属性作为值。

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

不要忘记添加一个相反的自定义操作来卸载这些文件在卸载,所以你不要留下的东西。