使用 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
。
不要忘记添加相反的自定义操作以在卸载时删除这些文件,这样您就不会遗漏任何东西。
我正在努力为我们基于 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
。
不要忘记添加相反的自定义操作以在卸载时删除这些文件,这样您就不会遗漏任何东西。