2010-04-08 28 views
13

Estamos trabajando en un sistema de actualización para nuestro software. El actualizador debe ejecutarse en segundo plano como un servicio, y cuando haya una actualización disponible, descárguelo e instálelo. Necesitamos el servicio para instalar la actualización ya que el MSI requiere elevación para ejecutarse, pero algunos de nuestros clientes serán usuarios restringidos.Ejecución de msiexec desde un servicio (cuenta del sistema local)

El MSI es un WiX MSI y hace una importante actualización cuando se ejecuta. El problema es que la actualización no parece funcionar cuando se ejecuta desde nuestro servicio. Puedo ver ejecutar msiexec, y vuelve con éxito, pero parece que no hace cambios en el sistema. El mismo comando, cuando se ejecuta desde mi cuenta de usuario funciona como se esperaba.

¿Hay alguna salvedad de ejecutar msiexec de un servicio de sistema local?

Simplemente estamos haciendo:

string arguments = "/i /quiet /lv*x " + pathToLogFile; 
System.Diagnostics.Process.Start("msiexec.exe", arguments); 
+0

¿Qué argumentos estás pasando? ¿Estás seguro de que pasas los argumentos correctos para hacer que esto sea una instalación silenciosa? ¿Y qué hace tu instalador? –

+0

Actualicé la pregunta para mostrar nuestros argumentos. El instalador podría estar haciendo muchas cosas (dependiendo de las características seleccionadas), incluida la adición de claves de registro a HKLM y HKCR, la instalación de controladores, el registro de objetos COM y, por supuesto, la copia de archivos. El acceso del administrador es lamentablemente inevitable. – Jarrod

+0

¿Ha intentado agregar el modificador/qn (msiexec /? Le mostrará todas las opciones disponibles)? ¿El archivo de registro produce información sobre errores o pasos omitidos? ¿Se puede modificar el registro con el de una instalación exitosa? –

Respuesta

5

Si su servicio es un servicio de Windows y luego hacer los siguientes pasos:

  1. Abrir las propiedades de su servicio en la consola de servicios.

  2. Ir a la Log On pestaña

  3. Establecer una cuenta que tiene los derechos para actualizar el sistema (el suyo o especialmente creado para este propósito)

  4. Reiniciar el servicio

En este caso, el servicio se ejecutará con los derechos adecuados y puede hacer actualizaciones.

+0

Creo que podemos hacer que esto funcione. ¡Gracias! – Jarrod

0

También tenían la misma función descrita arriba y me encontré con que si se ha instalado el programa para todos los usuarios, corriendo msiexec funcionaría de servicio que se ejecuta bajo la cuenta SYSTEM. Para que esto funcione, tendrá que instalarlo para TODOS los usuarios. En mi caso, especifiqué el comando msxexec de la siguiente manera cuando el programa se instaló por primera vez.

msiexec /i setup.msi ALLUSERS="1" 

Una vez hecho esto, puede simplemente actualizar el programa de Servicio sin ningún problema.

0

Es posible que necesite utilizar el parámetro REINSTALLMODE que le permite controlar la actualización. Si no se proporcionan, la instalación puede no actualizar su aplicación silenciosamente (o al menos eso es lo que he encontrado, aunque todavía estoy un poco inseguro de si se aplica el mismo comportamiento en System.Diagnostics.Process.Start):

msiexec.exe /i /quiet yourinstaller.msi REINSTALL=All REINSTALLMODE=vomus 

Ver here para obtener más información sobre las diversas banderas que se puede pasar a msiexec.exe.

3

En caso de que alguien más se topa con esto, aquí es lo que estaba descubriendo.

estaba instalando un programa de un servicio que se ejecuta como LocalSystem. La instalación volvería inmediatamente con el código de salida 0. Sin embargo, el programa no parecía estar instalado. Los archivos no se copiaron en su lugar y no se crearon accesos directos. Buscar en el archivo de registro fue difícil porque no tenía un mensaje simple de éxito o error. Cuando ejecuté el servicio como una cuenta de administrador normal, funcionó bien.Finalmente me di cuenta en el archivo de registro que se dijo

determinó que el producto existente (ya sea este producto o el producto siendo actualizado con un parche) se instalado por equipo.

No figuraba como instalado en el Panel de control> Programas, pero por alguna razón, Windows pensó que ya estaba instalado. Desafortunadamente, ejecutar msiexec /x para desinstalar el programa tampoco tuvo ningún efecto.

He intentado cambiar el código del producto y el código de actualización, y viola, funcionó. En mi caso, controlé el código del producto de instalación y los códigos de actualización, para poder hacerlo. Si en el caso de otra persona, no tiene dicho acceso, puede intentar instalar algún otro software arbitrario (que tendrá un código de producto/actualización diferente) y ver si eso funciona, y si lo hace, al menos usted sabe ese es el problema.

Cuestiones relacionadas