Como desinstalar com msiexec usando o id do produto guid sem.ficheiro msi presente
estou a tentar automatizar a desinstalação dos pacotes criados com o WiX para alterar a pilha e configuração de software instalada sem reprovisionar um SO inteiro. Eventualmente vou usar o powershell scripting para fazer isto, mas no momento não consigo fazer com que o meu pacote de testes desinstale interactivamente com o cmd.
Se eu correr:
msiexec /x '{A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}'
msiexec /x A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8
eu entendo:
"não foi possível abrir o pacote de instalação. Verificar se a pacote existe e que você pode acessá - lo, ou entrar em contato com o fornecedor de aplicativos para verificar se este é um pacote válido do Windows Installer."
Se eu fugir:
msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}
eu entendo:
"Esta acção só é válida para os produtos que estão actualmente instalados"
olhei para o guia do instalador do windows, a documentação do WiX , a documentação do msiexec e usei a orca para passar por cima da .msi eu mesmo, mas eu realmente não encontrei nada que dê uma clara imagem de como uma desinstalação é processada. É o ... o ficheiro msi é necessário e, se não for o caso, porque é que o instalador do windows parece pensar que é quando lhe é dado um GUID?
o Código WiX para o .o instalador msi é:
<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns='htp://schemas.microsoft.com/wix/2006/wi' >
<!--DO NOT COPY / PASTE THE PRODUCT ID GUID BELOW TO YOUR OWN WIX SOURCE -->
<Product Id='A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8' Language='2057'
Manufacturer='COMPANYNAME IT-Operations'
Name='COMPANYNAMEServerListener' Version='1.0.0'
UpgradeCode='PUT-GUID-HERE'>
<Package Id='*' Manufacturer='COMPANYNAME IT-Operations' Compressed='yes' />
<Media Id='1' Cabinet='COMPANYNAMEServerListener.cab' EmbedCab='yes' />
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id='ProgramFilesFolder' Name='PFiles'>
<Directory Id='COMPANYNAME' Name='COMPANYNAME'>
<Directory Id='INSTALLDIR' Name='COMPANYNAMEServerListener'>
<Component Id='MainExecutable' Guid='*' >
<File Id='COMPANYNAMEServerListener.exe'
Source='COMPANYNAMEServerListener.exe' Vital='yes'
KeyPath='yes' />
<ServiceInstall
Id='COMPANYNAMEServerListenerInstall'
DisplayName='COMPANYNAMEServerListener'
Description='Accepts and discards TCP connections on port 28028 to indicate that this server is alive and ready to be controlled'
Name='COMPANYNAMEServerListener'
Account='NT AUTHORITY\LocalService'
ErrorControl='normal'
Start='auto'
Type='ownProcess'
Vital='yes'
>
<ServiceDependency Id='tcpip'/>
</ServiceInstall>
<ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall" Name="COMPANYNAMEServerListener" Wait="yes" />
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
<Feature Id='Complete' Level='1' >
<ComponentRef Id='MainExecutable' />
</Feature>
<CustomTable Id ="COMPANYNAMEMetadata">
<Column Id="Property" Type="string" Category="Identifier" PrimaryKey="yes"/>
<Column Id="Value" Type="string"/>
<Row>
<Data Column="Property">InstallString</Data>
<Data Column="Value">/qn</Data>
</Row>
</CustomTable>
</Product>
</Wix>
7 answers
O comando que indicar está correcto: msiexec / x {a4bff20c-A21E-4720-88E5-79D5A5AEB2E8}
Se tiver " Esta acção só é válida para os produtos que estão actualmente instalados", terá usado um código de produto ou pacote não reconhecido, e terá de encontrar o correcto. Muitas vezes isso pode ser causado pelo uso de um código de pacote errado em vez de um código de Produto para desinstalar-um código de pacote muda com cada reconstrução de um arquivo MSI, e é o só o gráfico que vê quando vê a página de propriedade de um ficheiro msi. Deve funcionar para desinstalar, desde que use o direito. Não há margem para erros. Se você quiser encontrar o código do produto em vez disso, você precisa abrir o MSI. O código do produto é encontrado na tabela de propriedades.
Actualização, Jan. 2018:
Com todos os redirectos do registo em curso, Não tenho a certeza se a abordagem baseada no registo abaixo é uma opção viável. Não verifiquei correctamente porque agora confio no seguindo a abordagem usando PowerShell: Como posso encontrar o GUID do produto de uma instalação MSI instalada?Verifique também esta resposta ao estilo de referência descrevendo diferentes formas de Desinstalar um pacote MSI e formas de determinar a versão do produto que instalou: Desinstalar um ficheiro MSI a partir da linha de comandos sem usar o msiexec
Opção Legacy, registo:
Você também pode Encontrar o código do produto ao consultar o registo a partir desta chave de base: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Desinstall . Carregue em F3 e procure o nome do seu produto. (Se for um instalador de 32 bits numa máquina de 64 bits, poderá estar sob o HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Desinstall em vez disso).
Legacy, PowerShell option: (em grande parte semelhante à nova resposta ligada acima)
Finalmente, você pode encontrar o código do produto usando PowerShell:
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name
Post Similar: Wix-fazendo uma grande atualização em uma instalação multi instância (screenshot de como encontrar o código do produto no MSI).
Você tem certeza de que o produto está realmente instalado! Há algo no ARP / Programs & Features.
A instalação original é de fato visível no contexto atual. Parece que pode ter sido uma instalação por usuário, e se você está logado como outra pessoa agora, então ele não vai saber sobre isso - você precisa fazer login na mesma conta que a instalação original.
Se a pasta \Windows\installer foi danificada, o arquivo Cache estaria faltando, e isso é usado para fazer a desinstalação.
msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}
(os direitos de Administração necessários, obviamente - com Chavetas encaracoladas sem quaisquer aspas aqui-só são necessárias aspas, se os locais ou valores em branco forem indicados na linha de comandos.)
Se a mensagem for: "Esta acção só é válida para os produtos actualmente instalados", então é verdade. Ou o pacote com este ProductCode não está instalado ou há uma gralha.
Para verificar onde está a falha:
Primeiro tente carregar com o botão direito no (provavelmente) instalado .o msi arquivou-se. Você verá (além de "instalar" e "reparar") uma entrada desinstalada. Clica nisso.
a) se esse desinstalar funcionar, seu msi tem outro código de Produto do que você espera (talvez você tenha a fonte WiX errada ou sua construção tem logig dinâmico onde o ProductCode alteracao).
b) Se a desinstalação der o mesmo "...apenas Válido para produtos já instalados" o pacote não está instalado (o que é obiously uma condição prévia para ser capaz de desinstalar ele).Se 1.a) foi o caso, você pode procurar o código de produto correto de seu pacote, se você abrir seu arquivo msi com Orca, Insted ou outro editor/ferramenta. Procura-os no google. Veja na tabela com o nome " propriedade "e procure a string" ProductCode " na primeira coluna. Em a segunda coluna é o valor correto.
Apenas uma sugestão para a linha de comandos usada: eu acrescentaria pelo menos o "/qb" para uma barra de progresso simples ou parâmetro "/qn" (o último para desinstalação silenciosa completa, mas só faz sentido se tiver a certeza, funciona).
Quando o identificador do Produto foi deixado explícito e gravado como na pergunta, o resultado .msi não tinha propriedade ProductCode, mas uma propriedade Id produto em vez disso, quando inspecionado com orca.
Uma vez que eu mudei o GUID para '*' para auto-gerar, o ProductCode apareceu e tudo funciona bem com a sintaxe confirmada pelas outras respostas.
Você precisa de / q no final
MsiExec.exe /x {2F808931-D235-4FC7-90CD-F8A890C97B2F} /q
Tente este comando msiexec / x {ID do produto} / qr