2017-08-01 91 views
1

我正在爲基於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並將文件下載到安裝目錄。 –

回答

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

你需要有幾件事情的自定義操作中考慮將屬性傳遞給延遲操作的方法是,您必須使用「設置」操作,該操作設置了您想要使用的CustomAction的ID的EXACT名稱的屬性。然後,使用以逗號分隔的PropertyName = PropertyValue這是可以使用的格式[]中的安裝程序屬性作爲值。

只有當您在機器上安裝新產品(不升級或刪除)時,自定義操作的條件纔會讓此自定義操作運行。如果你只想要在第一次安裝時運行而不是升級,那麼只需在其中安裝AND NOT WIX_UPGRADE_DETECTED

不要忘記添加一個相反的自定義操作來卸載這些文件在卸載,所以你不要留下的東西。

相關問題