2010-02-09 9 views
13

Ich arbeite an einem Installer, der mehrere Windows-Dienste installieren soll. Wir machen ziemlich oft neue Builds (mit neuen .msi-Dateien) und verwenden größere Upgrades, um die Installation über eine vorherige Installation zu vereinfachen.Wix Major Upgrade: Wie verhindere ich die Neuinstallation von Windows-Diensten?

Das Problem ist, dass wir die Service-Dateien aktualisieren müssen, ohne die Service-Konfiguration zu überschreiben (zum Beispiel Benutzername und Passwort des Kontos).

Wir verwenden ServiceInstall und ServiceControl innerhalb der Komponente, die den Dienst exe Datei enthält. Gibt es eine Möglichkeit, die Ausführung von ServiceInstall bedingt zu machen (unter Verwendung einer Bedingung wie REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE), damit der Dienst beim Upgrade nicht deinstalliert wird (gerade gestoppt, damit wir die Dateien aktualisieren können)?

Eine Lösung wäre, benutzerdefinierte Aktionen zu verwenden, aber vielleicht gibt es einen besseren Weg?

Danke!

Antwort

11

Es scheint, dass ich an der falschen Stelle gesucht habe. Die Lösung für mein Problem ist das Hinzufügen der NOT UPGRADINGPRODUCTCODE zu der DeleteServices Standardaktion.

Das behebt mein Problem. Der Nachteil dieses Ansatzes besteht darin, dass alle Dienste, die von der aktuellen msi-Datei installiert werden, gelöscht werden (oder nicht). Daher kann ich Services bei einem Upgrade nicht selektiv löschen/behalten. Dies ist jedoch in Ordnung für mich - meine Anforderung, die Service-Anmeldeinformationen (aber nicht den tatsächlichen Service-Code) über Upgrades hinweg zu erhalten, ist erfüllt.

UPDATE: Die Bedingung für DeleteServices ist von WiX im InstallExecuteSequence Element zugänglich.

+0

Ich kann nicht glauben, dass ich nicht darüber nachgedacht habe. Vielen Dank für das Teilen! – Adkins

+0

Miron, Können Sie ein Beispiel veröffentlichen? Ich versuche, das Dienstkonto zwischen Upgrades zu speichern. –

+0

@MuriloLima Sorry, das war vor einigen Jahren. Diese Frage stammt aus einem früheren Leben :) und ich habe keinen Zugang mehr zu diesem Quellbaum. –

0

WiX aktualisiert nur Komponenten, deren Version neuer ist. Es überprüft nur eines der Felder (Dateiversion der Assemblyversion, ich kann mich nicht erinnern), so dass Sie die aktuellen Versionsinformationen in einem behalten und in dem anderen statisch behalten können. Dies könnte ein Hack sein, der für Sie arbeitet ...

+1

Nun, das Problem ist, dass ich die Dateien ersetzen muss, aber nicht die Konfiguration. Wenn ich kontrollieren könnte, wie die Konfiguration gespeichert wird, würde ich NeverOverwrite und Permanent für diese Dateien verwenden. Aber hier ist das Problem, dass das Passwort LSA gespeichert ist - daher muss ServiceInstall bedingt werden. –

0

Ich habe 2 Komponenten für die gleiche exe mit jeweils einer Bedingung erstellt. Eine für WIX_UPGRADE_DETECTED und eine für NOT WIX_UPGRADE_DETECTED. In WIX_UPGRADE_DETECTED würde ich das dienstinstall-Element und das NOT WIX_UPGRADE_DETECTED das dienstinstall-Element nicht einschließen.

1

Dies ist, wie die Lösung aussehen soll:

diese
<DeleteServices><![CDATA[NOT UPGRADINGPRODUCTCODE]]></DeleteServices> 

hinzufügen unter dem InstallExecuteSequence-Tag.

Hinweis: Stellen Sie sicher, dass das ursprüngliche MSI der ersten Version über dieses Tag verfügt, andernfalls müssen Sie es vollständig deinstallieren und installieren, und erst dann wird diese Konfiguration bei Upgrades wirksam.

Hinweis 2: Sie müssen nicht den CDATA-Tag verwenden es auch so aussehen kann:

<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices> 
+0

Der Hinweis "alte und neue msi müssen diesen Block haben" ist wichtig, da bei der Aktualisierung der alte deinstalliert wird und somit dieser Block in der alten msi ausgewertet wird. – MHolzmayr

0

Mit Bedingungen auf der Service-Standardaktionen skaliert einen Dienst nicht in der Vergangenheit.

Der Weg, dies zu tun, ist RemoveExistingProducts vor InstallFinalize zu planen. Stellen Sie dann sicher, dass Ihr neuere Build eine Service-EXE mit der gleichen Version wie das, was es ersetzt, hat. Auf diese Weise wird Windows Installer diese Komponente nicht deinstallieren/neu installieren.

Abschließend legen Sie Ihre Konfigurationsdaten in eine andere Komponente, die installiert werden und Ihren Dienst codieren wird, um zu bemerken, dass die Daten die Konfiguration geändert hat, und laden Sie sie bei Bedarf neu.

Persönlich mache ich das nicht. Ich höre auf, installiere neu, starte die Dienste die ganze Zeit ohne irgendwelche schrecklichen Konsequenzen, dann dauert die Installation ein paar Sekunden länger.

Verwandte Themen