2010-02-09 2 views
13

Je travaille sur un programme d'installation supposé installer plusieurs services Windows. Nous faisons de nouvelles constructions assez souvent (avec de nouveaux fichiers .msi), et nous utilisons des mises à jour majeures pour faciliter l'installation sur une installation précédente. Le problème est que nous devons mettre à jour les fichiers de service sans écraser la configuration du service (nom d'utilisateur et mot de passe du compte, par exemple). Nous utilisons ServiceInstall et ServiceControl dans le composant qui contient le fichier de service exe. Y at-il un moyen de rendre l'exécution de ServiceInstall conditionnelle (en utilisant une condition comme REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE) afin que le service ne soit pas désinstallé lors de la mise à niveau (juste arrêté pour que nous puissions mettre à jour les fichiers)?Mise à niveau majeure Wix: comment empêcher la réinstallation du service Windows?

Une solution serait d'utiliser des actions personnalisées, mais peut-être qu'il existe un meilleur moyen?

Merci!

Répondre

11

Il semble que je regardais au mauvais endroit. La solution à mon problème consiste à ajouter le NOT UPGRADINGPRODUCTCODE à l'action standard DeleteServices.

Cela résout mon problème. La mise en garde de cette approche est que tous les services installés par le fichier msi actuel sont supprimés (ou non). Je ne peux donc pas supprimer/conserver des services sélectivement sur une mise à jour. Cela me convient cependant - mon exigence de conserver les informations d'ouverture de session de service (mais pas le code de service réel) entre les mises à niveau est satisfaite. MISE À JOUR: La condition DeleteServices est accessible à partir de WiX dans l'élément InstallExecuteSequence.

+0

Je ne peux pas croire que je n'y ai pas pensé. Merci beaucoup de partager cela! – Adkins

+0

Miron, Pouvez-vous poster un exemple? J'essaye de sauver le compte de service entre les mises à niveau. –

+0

@MuriloLima Désolé, c'était il y a quelques années. Cette question vient d'une vie antérieure :) et je n'ai plus accès à cet arbre source. –

0

WiX ne mettra à jour les composants que si leur version est plus récente. Il ne vérifie que l'un des champs (Version du fichier de la version de l'assemblage, je ne m'en souviens pas) afin que vous puissiez conserver les informations de version actuelles en une seule et les garder statiques dans l'autre. Cela pourrait être un hack qui fonctionne pour vous ...

+1

Eh bien, le problème est que j'ai besoin de remplacer les fichiers, mais pas la configuration. Si j'avais le contrôle sur la façon dont la configuration est stockée, j'utiliserais NeverOverwrite et Permanent sur ces fichiers. Mais ici le problème est que le mot de passe est stocké LSA - d'où la nécessité de rendre ServiceInstall conditionnel. –

0

J'ai créé 2 composants pour le même exe avec une condition chacun. Un pour WIX_UPGRADE_DETECTED et un pour NOT WIX_UPGRADE_DETECTED. Dans WIX_UPGRADE_DETECTED, je n'inclurais pas l'élément serviceinstall et le NOT WIX_UPGRADE_DETECTED, incluez l'élément serviceinstall.

1

Voici comment la solution devrait ressembler à:

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

Ajouter cette sous la balise InstallExecuteSequence.

Remarque: Assurez-vous que la première version originale de MSI possède cette balise, sinon vous devrez la désinstaller et l'installer complètement, puis seulement cette configuration prendra effet lors des mises à niveau.

Note2: vous ne devez pas utiliser la balise CDATA il peut aussi ressembler à ceci:

<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices> 
+0

L'indice "les anciens et les nouveaux msi doivent avoir ce bloc" est important, car lors de la mise à niveau, l'ancien sera désinstallé et donc ce bloc évalué dans l'ancien msi. – MHolzmayr

0

En utilisant des conditions sur le service des actions standard ne seront pas l'échelle d'un service passé.

La procédure à suivre consiste à planifier RemoveExistingProducts avant InstallFinalize. Ensuite, assurez-vous que votre build plus récent a un service EXE avec la même version que ce qu'il remplace. De cette façon, Windows Installer ne désinstalle/réinstalle pas ce composant.

Enfin, placez vos données de configuration dans un autre composant qui sera installé et codez votre service pour remarquer que les données ont été modifiées et rechargez-les si nécessaire.

Personnellement, je ne fais pas ça. Je m'arrête, réinstalle, démarre les services tout le temps sans autre conséquence horrible alors l'installation prend quelques secondes de plus.