2010-02-09 8 views
13

Estoy trabajando en un instalador que se supone que debe instalar varios servicios de Windows. Hacemos nuevas compilaciones (con nuevos archivos .msi) con bastante frecuencia, y utilizamos las principales actualizaciones para facilitar la instalación en una instalación anterior.Wix Major Upgrade: ¿cómo evito la reinstalación del servicio de Windows?

El problema es que tenemos que actualizar los archivos del servicio sin sobreescribir la configuración del servicio (nombre de usuario y contraseña de la cuenta, por ejemplo).

Estamos usando ServiceInstall y ServiceControl dentro del componente que contiene el archivo de servicio exe. ¿Hay alguna manera de hacer que la ejecución de ServiceInstall sea condicional (usando una condición como REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE) para que el servicio no se desinstale al actualizar (solo se detuvo para que podamos actualizar los archivos)?

Una solución sería utilizar acciones personalizadas, pero tal vez hay una mejor manera?

Gracias!

Respuesta

11

Parece que estaba buscando en el lugar equivocado. La solución a mi problema es agregar el NOT UPGRADINGPRODUCTCODE a la acción estándar DeleteServices.

Esto solucionó mi problema. La advertencia de este enfoque es que todos los servicios instalados por el archivo actual msi se eliminan (o no). Por lo tanto, no puedo eliminar/mantener los servicios de forma selectiva en una actualización. Sin embargo, esto está bien para mí: mi requisito de mantener la información de inicio de sesión del servicio (pero no el código de servicio real) en todas las actualizaciones se cumple.

ACTUALIZACIÓN: Se puede acceder a la condición para DeleteServices desde WiX en el elemento InstallExecuteSequence.

+0

No puedo creer que no haya pensado en esto. ¡Muchas gracias por compartir esto! – Adkins

+0

Miron, ¿Puedes publicar un ejemplo? Estoy tratando de guardar la cuenta de servicio entre actualizaciones. –

+0

@MuriloLima Lo siento, esto fue hace algunos años. Esta pregunta es de una vida anterior :) y ya no tengo acceso a ese árbol fuente. –

0

WiX solo actualizará los componentes si su versión es más reciente. Solo comprueba uno de los campos (versión de archivo de la versión de ensamblaje, no lo recuerdo) para que pueda mantener la información de la versión actual en una y mantenerla estática en la otra. Esto podría ser un truco que funcione para usted ...

+1

Bueno, el problema es que necesito reemplazar los archivos, pero no la configuración. Si tuviera control sobre cómo se almacena la configuración, usaría NeverOverwrite y Permanent en esos archivos. Pero aquí el problema es que la contraseña está almacenada en LSA, de ahí la necesidad de hacer que ServiceInstall sea condicional. –

0

Creé 2 componentes para el mismo exe con una condición cada uno. Uno para WIX_UPGRADE_DETECTED y otro para NOT WIX_UPGRADE_DETECTED. En WIX_UPGRADE_DETECTED, no incluiría el elemento serviceinstall, y NOT WIX_UPGRADE_DETECTED, incluiría el elemento serviceinstall.

1

Esta es la forma en la solución debería ser:

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

Añadir este bajo la etiqueta de InstallExecuteSequence.

Nota: asegúrese de que la primera versión original de MSI tenga esta etiqueta o tendrá que desinstalar e instalar completamente y solo entonces esta configuración tendrá efecto en las actualizaciones.

Nota 2: usted no tiene que utilizar la etiqueta CDATA también puede tener este aspecto:

<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices> 
+0

La sugerencia de que "los msi viejos y nuevos tienen que tener este bloque" es importante, ya que durante la actualización se desinstalará el anterior y, por lo tanto, este bloque se evaluará en el viejo msi. – MHolzmayr

0

Utilizando las condiciones del servicio de acciones estándar no escalar más allá de un servicio.

La manera de hacerlo es programar RemoveExistingProducts antes de InstallFinalize. Luego, asegúrese de que su compilación más reciente tenga un EXE de servicio con la misma versión que lo que está reemplazando. De esta forma, Windows Installer no desinstalará ni reinstalará ese componente.

Finalmente ponga sus datos de configuración en otro componente que se instalará y codifique su servicio para observar que la configuración de los datos ha cambiado y vuelva a cargarla si es necesario.

Personalmente no hago esto. Detengo, vuelvo a instalar, inicio servicios todo el tiempo sin consecuencias horribles, y luego la instalación toma unos segundos más.

Cuestiones relacionadas