我正致力于为基于WIX的安装程序添加功能。这是我第一次使用WIX,所以这对我来说都很新鲜。
我尝试做的是允许用户在使用msiexec
时传递身份验证令牌命令行参数。
然后,安装程序将使用auth令牌进行API调用。如果auth失败,安装程序将终止。否则,安装程序将使用API下载文件并将其复制到安装目录(很可能在Program Files
下)。
我设法在命令行参数中读取WIX中的属性,并在C#中创建了一个CustomAction来处理身份验证/下载文件。
我挣扎的部分是让CustomAction将文件复制到安装位置,因为它没有权限写入该位置。
我可以通过设置execute="deffered"
和"impersonate=no
来提升权限,但这会阻止我从session
对象中读取属性。
另一种可能的选择是将文件保存到CustomAction中的临时位置(在没有提升权限的情况下工作)并设置新属性。然后,我可以将CopyFile
组件与SourceProperty
一起使用,将该文件复制到目标位置。
但是,我无法弄清楚如何让CustomAction在CopyFile
组件之前运行,因为在运行CustomAction之后,属性不会被设置。是否只是简单地运行CustomAction before
安装的特定部分,还是有更多内容?
答案 0 :(得分:1)
您仍然可以在延迟的自定义操作期间从会话对象中读取属性,您只需要在命令行上将{9}}传入的公共属性定义,然后在延迟的自定义之前执行第二个自定义操作为延迟操作设置CustomActionData属性的操作,以便它可以在执行期间读取公共属性的值。
你需要定义类似这样的东西
Secure="yes"
要在自定义操作中访问您传入的属性值,您现在需要使用
<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>
将属性传递给延迟操作时需要考虑的一些事项是,必须使用“设置”操作,该操作使用您要在其中使用的CustomAction的ID的EXACT名称设置属性。然后使用以逗号分隔的PropertyName = PropertyValue列表,其格式化意味着您可以将[]中的安装程序属性用作值。
自定义操作的条件将使此自定义操作仅在您在计算机上安装新产品时运行(而不是升级或删除)。如果您只希望操作在第一次安装时运行而不是在升级时只需在其中抛出string AuthToken = session.CustomActionData["AUTHTOKEN"];
string InstallDir = session.CustomActionData["INSTALLDIR"];
... try download to installdir ...
。
不要忘记在卸载时添加相反的自定义操作以删除这些文件,这样就不会遗漏任何内容。