2017-08-01 9 views
1

Ich arbeite daran, unserem WIX-basierten Installationsprogramm eine Funktion hinzuzufügen. Es ist das erste Mal, dass ich mit WIX arbeite, also ist es alles ziemlich neu für mich.Herunterladen und Kopieren von Dateien mit dem WIX-Toolset

Was ich versuche zu tun, ist es Benutzern ermöglichen, ein Auth-Token-Befehlszeilenargument übergeben, wenn Sie msiexec verwenden.

Das Installationsprogramm führt dann einen API-Aufruf mit dem Authentifizierungs-Token durch. Wenn die Authentifizierung fehlschlägt, wird das Installationsprogramm beendet. Andernfalls lädt das Installationsprogramm eine Datei über die API herunter und kopiert sie in das Installationsverzeichnis (höchstwahrscheinlich unter Program Files).

Ich habe es geschafft, in der Befehlszeile Argumente als Eigenschaften in WIX einzulesen und eine CustomAction in C# erstellt, um die Authentifizierung/das Herunterladen der Datei zu behandeln.

Der Teil, mit dem ich kämpfe, ist die CustomAction, um die Datei in den Installationsort zu kopieren, da sie keine Schreibrechte für den Speicherort hat.

Ich kann es mit erweiterten Rechten ausführen muß, indem jedoch execute="deffered" und "impersonate=no Einstellung, die mich in den Eigenschaften von dem session Objekt aus der Lektüre verhindert.

Eine weitere mögliche Option besteht darin, die Datei an einer temporären Position in CustomAction zu speichern (die ohne erhöhte Berechtigungen funktioniert) und eine neue Eigenschaft festzulegen. Dann kann ich die CopyFile Komponente mit SourceProperty verwenden, um diese Datei zum Zielort zu kopieren.

Ich kann jedoch nicht herausfinden, wie die CustomAction vor der Komponente CopyFile ausgeführt wird, da die Eigenschaft nicht festgelegt wurde, bis die CustomAction ausgeführt wurde. Ist es einfach, die CustomAction before einen bestimmten Teil der Installation auszuführen, oder gibt es noch mehr?

+1

Es sollte so einfach wie die Planung sein, bevor "MoveFiles" (http://wixtoolset.org/documentation/manual/v3/xsd/wix/copyfile.html erwähnt die DuplicateFiles und MoveFiles Tabellen und ich nehme an, dass es die MoveFiles verwendet Tabelle, wenn Sie ein CopyFile definieren, das nicht auf die ID eines Dateielements verweist), aber ich füge eine Antwort hinzu, mit der Sie Ihre benutzerdefinierte Aktion verzögern und die Dateien in das Installationsverzeichnis herunterladen können. –

Antwort

1

Sie können weiterhin Objekte aus dem Sitzungsobjekt während einer verzögerten Aktion lesen müssen Sie nur Ihre öffentliche Eigenschaft definieren, die auf der Kommandozeile als Secure="yes" übergeben und dann eine zweite benutzerdefinierte Aktion machen, die vor der Aktion Ihre latente individuelle läuft einstellen die CustomActionData-Eigenschaft für Ihre verzögerte Aktion, damit sie den Wert der öffentlichen Eigenschaft während der Ausführung lesen kann.

Sie werden so etwas wie dieses

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

definieren müssen und Ihre in Eigenschaftswerte innerhalb der benutzerdefinierten Aktion übergeben zugreifen müssen Sie jetzt

string AuthToken = session.CustomActionData["AUTHTOKEN"]; 
string InstallDir = session.CustomActionData["INSTALLDIR"]; 

... try download to installdir ... 

ein paar Dinge, die Sie verwenden müssen Beachten Sie beim Übergeben von Eigenschaften an eine verzögerte Aktion, dass Sie eine "Set" -Aktion verwenden müssen, die eine Eigenschaft mit dem EXACT-Namen der CustomAction-ID festlegt, in der Sie sie verwenden möchten. Dann verwenden Sie eine durch Kommas getrennte Liste von PropertyName = PropertyValue Das ist formatiert, was bedeutet, dass Sie verwenden können Installer-Eigenschaften in [] 's als Werte.

Die Bedingungen der benutzerdefinierten Aktionen lassen diese benutzerdefinierte Aktion nur dann ausführen, wenn Sie ein neues Produkt auf dem Computer installieren (nicht aufstocken oder entfernen). Wenn Sie nur möchten, dass die Aktion bei der ersten Installation und nicht bei Upgrades ausgeführt wird, werfen Sie einfach eine AND NOT WIX_UPGRADE_DETECTED dorthin.

Vergessen Sie nicht, eine entgegengesetzte benutzerdefinierte Aktion hinzuzufügen, um diese Dateien bei der Deinstallation zu entfernen, damit Sie die Dinge nicht zurücklassen.

Verwandte Themen