A correção usual para esse erro é reiniciar a máquina, o que, de fato, geralmente corrige o problema. Outras soluções para casos particularmente difíceis incluem desabilitar o serviço de instalação e, em seguida, reiniciar.
Mas, para os propósitos desta questão, finja que este erro está ocorrendo em um servidor ou algum outro sistema onde o tempo de inatividade seria inaceitável. Queremos fazer isso sem reiniciar.
Claramente, há alguns dados sendo armazenados, em algum lugar, que o instalador está verificando antes de lançar esta mensagem de erro. Existe algum sinalizador que informa ao serviço do instalador que há outra instalação em andamento.
O que me interessa é onde esses dados estão sendo armazenados .
O que exatamente notifica o serviço de instalação de que outra instalação já está em andamento?
O tempo de execução do Windows Installer adquire um mutex global com o nome
_MSIExecute
durante determinados estágios de uma (des)instalação. Um mutex só pode pertencer a um thread por vez; para um mutex global, ou seja, um thread em todo o sistema. Qualquer tentativa subsequente de obter a propriedade do mutex falhará até que o proprietário atual o libere.Um mutex é um objeto transitório no kernel do Windows. Não é um arquivo no disco em nenhum ponto. Um mutex é liberado automaticamente se o thread proprietário atual sair sem liberá-lo explicitamente.
Este é o mesmo mecanismo que alguns programas usam para impedir a execução de várias instâncias do programa.
Para responder à outra pergunta implícita de qual processo está mantendo esse mutex, você pode usar ferramentas como o Process Explorer ou Handle da Microsoft/Sysinternals para encontrar mutexes. No Process Explorer, ele deve aparecer na pesquisa de identificadores (Ctrl+F).
Depois de encontrar o processo, você precisará decidir o que fazer com ele. A opção mais segura geralmente é esperar, embora, se de alguma forma ele ficar preso em uma etapa de (des)instalação, talvez você não tenha escolha a não ser eliminá-lo. É claro que matá-lo pode ter consequências, por exemplo, deixar um programa meio (des)instalado por aí - o MSI deve garantir reversões, mas isso é difícil quando o processo que as executa é encerrado! Também é difícil julgar se está realmente travado, pois algumas etapas podem levar muito tempo para serem concluídas.
Veja também: