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>
Author: Stein Åsmul, 2014-02-01

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

enter image description here

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).

 27
Author: Stein Åsmul, 2018-01-17 23:20:38
Não há razão para o comando não funcionar. As questões semi-óbvias são:
  1. Você tem certeza de que o produto está realmente instalado! Há algo no ARP / Programs & Features.

  2. 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.

  3. Se a pasta \Windows\installer foi danificada, o arquivo Cache estaria faltando, e isso é usado para fazer a desinstalação.

 2
Author: PhilDW, 2014-02-01 19:09:36
O bom é que este é fácil e deterministicamente analisar: Ou, o pacote msi não está realmente instalado no sistema ou você está fazendo algo errado. Claro que a chamada correcta é:
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:

  1. 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).

  2. 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.

Não há outras possibilidades.

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).

 2
Author: Philm, 2014-02-18 14:38:45
Msiexec.exe / x "{588A9A11-1E20-4B91-8817-2D36ACBBBF9F} " / q
 1
Author: suhail sayyad, 2018-01-17 08:14:31
Obrigado pela ajuda, parece que foi uma questão WiX.

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.

 0
Author: snoweagle, 2014-02-17 16:48:37

Você precisa de / q no final

MsiExec.exe /x {2F808931-D235-4FC7-90CD-F8A890C97B2F} /q
 0
Author: TheBitBucket, 2016-04-20 11:58:29

Tente este comando msiexec / x {ID do produto} / qr

 0
Author: Sushant Saurabh, 2016-08-14 20:05:09