Pregunta

Puedo desinstalar con éxito una aplicación de terceros a través de la línea de comando y mediante un instalador personalizado de Inno Setup.

Ejecución de línea de comando:

MSIEXEC.exe /x {14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn

Comando de configuración de Inno:

[Run]
Filename: msiexec.exe; Flags: runhidden waituntilterminated; 
Parameters: "/x {{14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn";
StatusMsg: "Uninstalling Service...";

También puedo desinstalar la aplicación mediante programación cuando ejecuto el siguiente código C# en modo de depuración.

Código C#:

string fileName = "MSIEXEC.exe";
string arguments = "/x {14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn";

ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments)
{
    CreateNoWindow = true,
    UseShellExecute = false,
    RedirectStandardOutput = true
};

Process process = Process.Start(psi);
string errorMsg = process.StandardOutput.ReadToEnd();
process.WaitForExit();

Sin embargo, el mismo código C# produce el siguiente resultado de error cuando se ejecuta como un servicio de Windows compilado e implementado:

"This action is only valid for products that are currently installed."

Comentarios adicionales:

  • El servicio de Windows que está emitiendo el comando Desinstalar se ejecuta en la misma máquina que el código que se prueba en modo de depuración.El servicio de Windows se ejecuta/registra como la cuenta del sistema local.
  • He consultado mis registros de aplicaciones y he validado que los argumentos de comando ejecutados son los mismos tanto en modo de depuración como de liberación.
  • He consultado al espectador de eventos, pero no ofrece ninguna pista.

¿Pensamientos?Cualquier ayuda sería muy apreciada.Gracias.

¿Fue útil?

Solución 3

Gracias a quienes ofrecen ayuda.Esto parece ser un problema de permisos.Actualicé mi servicio para que se ejecute con una cuenta de administrador y pude desinstalar correctamente la aplicación de terceros.Para el punto de Orion, aunque la cuenta del Sistema Local es una cuenta poderosa que tiene acceso completo al sistema... http://technet.microsoft.com/en-us/library/cc782435.aspx -- no parece tener los derechos necesarios para realizar la desinstalación.

[Consulte los comentarios adicionales para conocer la historia completa sobre la capacidad de LocalSystem de desinstalar la aplicación para la que instaló.]

Otros consejos

Paso 1: Verifique los archivos de registro de errores de MSI

Sospecho que su problema se debe a que se ejecuta como LocalSystem.

La cuenta del sistema local no es lo mismo que una cuenta de usuario normal que tiene derechos de administrador.No tiene acceso a la red y su interacción con el registro y el sistema de archivos es bastante diferente.

Desde la memoria, cualquier solicitud para leer/escribir en su 'directorio de inicio' o HKCU en el registro en realidad ingresa al perfil de usuario predeterminado o, en el caso de directorios temporales, c:\windows\temp

Me encontré con problemas similares en el pasado con la instalación, un cliente estaba usando la cuenta SISTEMA para instalar y esto estaba causando todo tipo de problemas de permisos para usuarios no administrativos.

Los archivos de registro MSI realmente no ayudarán si la aplicación no aparece "instalada", sugeriría comenzar capturando el resultado de MSIINV.EXE bajo la cuenta del sistema, eso le dará un "Inventario" de los programas actualmente instalados (o lo que ese usuario ve instalado) http://blogs.msdn.com/brada/archive/2005/06/24/432209.aspx

Creo que probablemente necesites volver a la mesa de dibujo y ver si realmente necesitas el servicio de Windows para realizar la desinstalación.Probablemente te encontrarás con todo tipo de problemas con Vista UAC si aún no lo has hecho...

Esto es extraño.LocalSystem definitivamente tiene privilegios para instalar aplicaciones (así es como funcionan Windows Update y la implementación de software en Active Directory), por lo que también debería poder desinstalarlas.

¿Quizás la aplicación se instala inicialmente por usuario en lugar de por máquina?

@Pablo Lalonde

El instalador de la aplicación está incluido en un instalador InnoSetup personalizado.El instalador de InnoSetup, a su vez, lo ejecuta manualmente el usuario que ha iniciado sesión.Dicho esto, la desinstalación la activa un servicio que se ejecuta en la cuenta del sistema local.

Al parecer, estabas en lo cierto.Hice una prueba rápida en la que el servicio se ejecutaba en la cuenta LocalSystem, se instalaba y desinstalaba la aplicación y todo funcionó a la perfección.Tenías razón.La cuenta LocalSystem ha requerido permisos de desinstalación para las aplicaciones en las que se instala.Salvaste el día.¡Gracias por la respuesta!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top