O comando de desinstalação falha apenas no modo de versão
Pergunta
Consigo desinstalar com êxito um aplicativo de terceiros por meio da linha de comando e de um instalador personalizado do Inno Setup.
Execução da linha de comando:
MSIEXEC.exe /x {14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn
Comando de configuração do Inno:
[Run]
Filename: msiexec.exe; Flags: runhidden waituntilterminated;
Parameters: "/x {{14D74337-01C2-4F8F-B44B-67FC613E5B1F} /qn";
StatusMsg: "Uninstalling Service...";
Também consigo desinstalar o aplicativo programaticamente ao executar o seguinte código C# no modo de depuração.
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();
O mesmo código C#, no entanto, produz a seguinte saída de falha quando executado como um serviço do Windows compilado e implantado:
"This action is only valid for products that are currently installed."
Comentários adicionais:
- O serviço Windows que está emitindo o comando desinstala está em execução na mesma máquina que o código que está sendo testado no modo de depuração.O serviço do Windows está em execução/logado como a conta do sistema local.
- Consultei meus logs de aplicativos e validei que os argumentos de comando executados são os mesmos no modo de depuração e liberação.
- Consultei o visualizador de eventos, mas ele não oferece pistas.
Pensamentos?Qualquer ajuda seria muito apreciada.Obrigado.
Solução 3
Obrigado àqueles que oferecem ajuda.Este parece ser um problema de permissões.Atualizei meu serviço para ser executado com uma conta de administrador e consegui desinstalar com êxito o aplicativo de terceiros.Na opinião de Orion, embora a conta do Sistema Local seja uma conta poderosa que tem acesso total ao sistema - http://technet.microsoft.com/en-us/library/cc782435.aspx - parece não ter os direitos necessários para executar a desinstalação.
[Veja comentários adicionais para a história completa sobre a capacidade do LocalSystem de desinstalar o aplicativo para o qual foi instalado.]
Outras dicas
Passo 1: Verifique os arquivos de log de erros do MSI
Suspeito que seu problema seja devido à execução como LocalSystem.
A conta do sistema local não é igual a uma conta de usuário normal que possui direitos de administrador.Ele não tem acesso à rede e sua interação com o registro e o sistema de arquivos é bem diferente.
Da memória, quaisquer solicitações de leitura/gravação em seu 'diretório inicial' ou HKCU no registro vão para o perfil de usuário padrão ou, no caso de diretórios temporários, c:\windows\temp
Já me deparei com problemas semelhantes com a instalação no passado, um cliente estava usando a conta SYSTEM para instalar e isso estava causando todos os tipos de problemas de permissão para usuários não administrativos.
Os arquivos de log MSI realmente não vão ajudar se o aplicativo não parecer "instalado", sugiro começar capturando a saída de MSIINV.EXE
na conta do sistema, você receberá um "Inventário" dos programas atualmente instalados (ou o que o usuário vê instalado) http://blogs.msdn.com/brada/archive/2005/06/24/432209.aspx
Acho que você provavelmente precisará voltar à prancheta e ver se realmente precisa do serviço do Windows para desinstalar.Você provavelmente encontrará todos os tipos de problemas do Vista UAC, se ainda não o fez...
Isso é bizarro.LocalSystem definitivamente tem privilégios para instalar aplicativos (é assim que o Windows Update e a implantação de software no Active Directory funcionam), portanto, ele também deve ser capaz de desinstalar.
Talvez o aplicativo seja inicialmente instalado por usuário em vez de por máquina?
@Paul Lalonde
O instalador do aplicativo está incluído em um instalador InnoSetup personalizado.O instalador do InnoSetup, por sua vez, é executado manualmente pelo usuário logado.Dito isto, a desinstalação é acionada por um serviço executado na conta do Sistema Local.
Aparentemente, você estava no caminho certo.Fiz um teste rápido em que o serviço foi executado na conta LocalSystem, instalei e desinstalei o aplicativo e tudo funcionou perfeitamente.Você estava certo.A conta LocalSystem requer permissões de desinstalação para os aplicativos nos quais é instalada.Você salvou o dia.Obrigado pelo feedback!