Como posso encontrar o GUID do produto de uma instalação MSI instalada?

Eu preciso encontrar o produto GUID para um arquivo MSI instalado para executar manutenção, como patch, desinstalar e também para fins de auditoria.

Versão curta

As informações abaixo cresceram consideravelmente ao longo do tempo e podem ter se tornado um pouco elaboradas demais. Como obter códigos de produto rapidamente? (quatro abordagens):

1. Use o “one-liner” do Powershell

Role para baixo para captura de canvas e passo a passo . Isenção de responsabilidade também abaixo – riscos menores ou moderados, dependendo de quem você pergunta. Funciona bem para mim. Qualquer auto-reparo triggersdo por esta opção geralmente deve ser possível cancelar. As verificações de integridade do pacote acionadas adicionam algum “ruído” ao log de events. Nota ! IdentifyingNumber é o ProductCode (peculiaridade do WMI).

 get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize 

Início rápido do Powershell : segure a tecla Windows , toque em R , digite “powershell” e pressione Enter

2. Use o VBScript

Descrito abaixo em ” Ferramentas alternativas” (seção 3) . Esta opção pode ser mais segura que o Powershell por razões explicadas em detalhes abaixo. Em essência, ele é (muito) mais rápido e incapaz de acionar o auto-reparo da MSI, já que ele não passa pelo WMI (acessa a API MSI COM diretamente – a uma velocidade espantosa). No entanto, é mais envolvido do que a opção Powershell (várias linhas de código).

3. Pesquisa de registro

Alguns juram procurando as coisas no registro. Não é minha abordagem recomendada – gosto de passar por APIs adequadas (ou em outras palavras: chamadas de function do sistema operacional). Há sempre exceções estranhas contabilizadas apenas pelos internos da implementação da API:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
  • HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall

4. Arquivo original MSI / fonte WiX

Você pode encontrar o Product Code do Product Code na Property table de qualquer arquivo MSI (e qualquer outra propriedade também). No entanto, o GUID poderia (raramente) ser substituído por uma transformação aplicada no momento da instalação e, portanto, não corresponder ao GUID no qual o produto está registrado (a abordagem 1 e 2 acima relatará o código real do produto – que está registrado no Windows – em cenários raros).

Você precisa de uma ferramenta para visualizar arquivos MSI . Veja a parte inferior da resposta a seguir para obter uma lista de ferramentas gratuitas que você pode baixar (ou veja a opção rápida abaixo): Como posso comparar o conteúdo de dois (ou mais) arquivos MSI?

ATUALIZAÇÃO : Para conveniência e necessidade de velocidade :-), faça o download do SuperOrca sem demora e faça um barulho a partir deste hotlink de download direto – a ferramenta é boa o suficiente para fazer o trabalho – instale, abra o MSI e vá direto para a tabela de propriedades. Linha do ProductCode ( por favor, verifique sempre um hotlink de download direto – obviamente – você pode usar o virustotal.com para fazer isso – varredura online utilizando dezenas de pacotes de antivírus e malware para verificar o que você carrega).


E abaixo você encontrará a resposta original que “organicamente cresceu” em muitos detalhes.

Talvez veja a seção ” Desinstalar Pacotes MSI ” abaixo se esta é a tarefa que você precisa executar.


Recuperar códigos de produto

ATUALIZAÇÃO : Se você também precisar do código de atualização , verifique esta resposta: Como posso encontrar o código de atualização para um arquivo MSI instalado? (recupera códigos de produtos associados, códigos de atualização e nomes de produtos em uma saída de tabela – semelhante à abaixo).

  • Não pode usar o PowerShell? Consulte a seção “Ferramentas alternativas” abaixo.
  • Olhando para desinstalar? Consulte a seção “Desinstalar pacotes MSI” abaixo.

Ative o Powershell ( mantenha pressionada a tecla Windows, toque em R, solte a tecla Windows, digite “powershell” e pressione OK ) e execute o comando abaixo para obter uma lista de códigos de produtos do pacote MSI instalados junto com o caminho do pacote de cache local e o nome do produto (maximize a janela do PowerShell para evitar nomes truncados).

Antes de executar esta linha de comando, leia o aviso abaixo (nada perigoso, apenas alguns possíveis incômodos). A seção 3 em “Ferramentas alternativas” mostra uma maneira alternativa não WMI de obter as mesmas informações usando o VBScript. Se você estiver tentando desinstalar um pacote, há uma seção abaixo com algumas linhas de comando msiexec.exe de amostra:

 get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize 

A saída deve ser semelhante a isso:

insira a descrição da imagem aqui

Nota! Por algum motivo estranho o “ProductCode” é referido como “IdentifyingNumber” no WMI. Então, em outras palavras – na figura acima, o IdentifyingNumber é o ProductCode.

Se você precisar executar essa consulta remotamente em vários computadores remotos , consulte a seção ” Recuperar códigos de produto de um computador remoto ” abaixo.

AVISO LEGAL (importante, por favor, leia antes de executar o comando!): Devido ao estranho design da Microsoft, qualquer chamada WMI para Win32_Product (como o comando PowerShell abaixo) acionará uma validação da propriedade do pacote . Além de ser bastante lento , isso pode, em casos raros, desencadear um auto-reparo do MSI. Isso pode ser um pacote pequeno ou algo enorme – como o Visual Studio. Na maioria dos casos isso não acontece – mas existe um risco. Não execute este comando antes de uma reunião importante – não é sempre perigoso (é somente leitura), mas pode levar a um longo reparo em casos muito raros (acho que você pode cancelar o auto-reparo também) a menos que ativamente evitado pelo pacote em questão, mas ele será reiniciado se você chamar Win32_Product novamente e isso persistirá até que você deixe o reparo automático terminar – às vezes ele pode continuar mesmo se você terminar: Como posso determinar o que causa repetidas Auto-reparo do Windows Installer? ).

E apenas para o registro: algumas pessoas relatam seus logs de events preenchendo com inputs MsiInstaller EventID 1035 (ver resposta do chefe de código) – aparentemente causada por consultas WMI para a class Win32_Product (pessoalmente eu nunca vi isso). Isso não está diretamente relacionado ao comando Powershell sugerido acima, é no contexto do uso geral da class WIM Win32_Product.

Você também pode obter a saída em forma de lista (em vez de tabela):

 get-wmiobject -class Win32_Product 

Neste caso, a saída é semelhante a esta:

insira a descrição da imagem aqui


Recuperar códigos de produto de um computador remoto

Em teoria, você deve ser capaz de especificar um nome de computador remoto como parte do próprio comando. Aqui está o mesmo comando acima configurado para rodar na máquina “RemoteMachine” (seção -ComputerName RemoteMachine adicionada):

 get-wmiobject Win32_Product -ComputerName RemoteMachine | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize 

Isso pode funcionar se você estiver executando com direitos de administrador de domínio em um domínio adequado. Em um ambiente de grupo de trabalho (small office / home network), você provavelmente precisará adicionar credenciais de usuário diretamente às chamadas WMI para que funcione.

Além disso, as conexões remotas no WMI são afetadas por (pelo menos) o Firewall do Windows , as configurações do DCOM eo Controle de Conta de Usuário (UAC) (além de outros fatores que não sejam da Microsoft – por exemplo, firewalls reais , firewalls de software de terceiros , tipos , etc …). Se vai funcionar ou não, depende da sua configuração exata.

  • Configurando uma conexão WMI remota
  • Conectando-se ao WMI remotamente com o PowerShell

ATUALIZAÇÃO : Uma extensa seção sobre a execução remota do WMI pode ser encontrada nesta resposta: Como posso encontrar o código de atualização para um arquivo MSI instalado? . Parece que uma regra de firewall e a supressão do prompt do UAC por meio de um ajuste de registro podem fazer as coisas funcionarem em um ambiente de rede de grupo de trabalho. Não recomendado mudanças de segurança, mas funcionou para mim.


Ferramentas alternativas

O PowerShell requer que o .NET framework seja instalado (atualmente na versão 3.5.1 parece? Outubro de 2017). O próprio aplicativo PowerShell real também pode estar ausente da máquina, mesmo se o .NET estiver instalado. Por fim, acredito que o PowerShell pode ser desabilitado ou bloqueado por várias políticas e privilégios do sistema.

Se este for o caso, você pode tentar algumas outras maneiras de recuperar códigos de produtos. Minha alternativa preferida é o VBScript – ele é rápido e flexível (mas também pode ser bloqueado em certas máquinas, e o script é sempre um pouco mais complicado do que o uso de ferramentas).

  1. Vamos começar com uma ferramenta wbemtest.exe Windows WMI : wbemtest.exe .

    • Inicie o wbemtest.exe ( mantenha pressionada a tecla Windows, toque em R, solte a tecla Windows, digite “wbemtest.exe” e pressione OK ).
    • Clique em conectar e depois em OK (o namespace é padronizado como root \ cimv2) e clique em ” conectar ” novamente.
    • Clique em ” Query ” e digite este comando WQL (sabor SQL): SELECT IdentifyingNumber,Name,Version FROM Win32_Product e clique em “Use” (ou equivalente – a ferramenta será localizada).
    • Captura de canvas de saída de amostra (truncada). Não é a melhor formatação, mas você pode obter os dados de que precisa. IdentifyingNumber é o código do produto MSI :

wbemtest.exe

  1. Em seguida, você pode tentar uma ferramenta WMI personalizada, com mais resources completos, como o WMIExplorer.exe

    • Isso não está incluído no Windows. É uma ferramenta muito boa, no entanto. Recomendado.
    • Confira em: https://github.com/vinaypamnani/wmie2/releases
    • Inicie a ferramenta, clique em Conectar, clique duas vezes em ROOT \ CIMV2
    • Na guiaConsulta “, digite a seguinte consulta SELECT IdentifyingNumber,Name,Version FROM Win32_Product e pressione Execute.
    • Captura de canvas ignorada, o aplicativo requer muito espaço na canvas.
  2. Finalmente, você pode tentar um VBScript para acessar informações por meio da interface de automação do MSI (recurso principal do Windows – ele não está relacionado ao WMI ).

    • Copie o script abaixo e cole em um arquivo * .vbs em sua área de trabalho e tente executá-lo clicando duas vezes. Sua área de trabalho deve ser gravável para você ou você pode usar qualquer outro local gravável.
    • Este não é um ótimo VBScript. A intensidade foi preferida em relação ao tratamento de erros e integridade, mas deve fazer o trabalho com o mínimo de complexidade.
    • O arquivo de saída é criado na pasta em que você executa o script (a pasta deve ser gravável ). O arquivo de saída é chamado msiinfo.csv .
    • Dê um duplo clique no arquivo para abrir em um aplicativo de planilha, selecione vírgula como delimitador na importação – OU – basta abrir o arquivo no Bloco de Notas ou em qualquer visualizador de texto.
    • Abrir em uma planilha permitirá resources avançados de sorting.
    • Esse script pode ser facilmente adaptado para mostrar uma quantidade significativa de detalhes adicionais sobre a instalação do MSI . Uma demonstração disso pode ser encontrada aqui: como descobrir quais produtos estão instalados – produtos mais novos já estão instalados nas janelas MSI .
 ' Retrieve all ProductCodes (with ProductName and ProductVersion) Set fso = CreateObject("Scripting.FileSystemObject") Set output = fso.CreateTextFile("msiinfo.csv", True, True) Set installer = CreateObject("WindowsInstaller.Installer") On Error Resume Next ' we ignore all errors For Each product In installer.ProductsEx("", "", 7) productcode = product.ProductCode name = product.InstallProperty("ProductName") version=product.InstallProperty("VersionString") output.writeline (productcode & ", " & name & ", " & version) Next output.Close 

Não consigo pensar em nenhuma outra opção de finalidade geral para recuperar códigos de produto no momento, por favor adicione se você souber de algum. Basta editar inline em vez de adicionar muitos comentários, por favor.

Você certamente pode acessar essas informações de dentro de seu aplicativo chamando a interface de automação do MSI (com base em COM) ou as funções de instalador do C ++ MSI (API do Win32). Ou até mesmo use consultas WMI de dentro do seu aplicativo, como nas amostras acima, usando o PowerShell , o wbemtest.exe ou o WMIExplorer.exe .


Desinstalar Pacotes MSI

Se o que você deseja fazer é desinstalar o pacote MSI para o qual você encontrou o código do produto, faça o seguinte, usando um prompt de comando elevado (procure por cmd.exe , clique com o botão direito e execute como administrador ):

Opção 1 : Desinstalação básica e interativa sem registro (rápido e fácil):

 msiexec.exe /x {00000000-0000-0000-0000-00000000000C} 

Explicação rápida do parâmetro:

 /X = run uninstall sequence {00000000-0000-0000-0000-00000000000C} = product code for product to uninstall 

Você também pode habilitar (verbose) o registro e executar no modo silencioso se quiser, nos levando à opção 2:

Opção 2 : Desinstalação silenciosa com registro detalhado (melhor para arquivos em lote):

 msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress 

Explicação rápida do parâmetro:

 /X = run uninstall sequence {00000000-0000-0000-0000-00000000000C} = product code for product to uninstall /QN = run completely silently /L*V "C:\My.log"= verbose logging at specified path REBOOT=ReallySuppress = avoid unexpected, sudden reboot 

Há uma referência abrangente para a desinstalação do MSI aqui (várias maneiras diferentes de desinstalar pacotes MSI): Desinstalando um arquivo MSI da linha de comando sem usar msiexec . Existe uma infinidade de maneiras diferentes de desinstalar.

Se você estiver escrevendo um arquivo de lote, dê uma olhada na seção 3 da resposta vinculada acima para algumas variantes de linha de comando de desinstalação comuns e padrão.

E um link rápido para msiexec.exe (opções de linha de comando) (visão geral da linha de comando para msiexec.exe do MSDN). E a versão do Technet também.


Recuperando outras propriedades / informações do MSI (código de atualização f.ex)

ATUALIZAÇÃO : encontre uma nova resposta sobre como encontrar o código de atualização dos pacotes instalados, em vez de procurar manualmente o código em arquivos MSI. Para pacotes instalados, isso é muito mais confiável. Se o pacote não estiver instalado, você ainda precisará procurar no arquivo MSI (ou no arquivo de origem usado para compilar o MSI) para localizar o código de atualização. Deixando na seção mais antiga abaixo:

Se você deseja obter o UpgradeCode ou outras propriedades do MSI , é possível abrir o MSI de instalação em cache do produto a partir do local especificado por ” LocalPackage ” na imagem mostrada acima (algo como: C:\WINDOWS\Installer\50c080ae.msi – é um nome de arquivo hexadecimal, exclusivo em cada sistema). Então você olha na ” Tabela de propriedades ” para UpgradeCode (é possível que o UpgradeCode seja redefinido em uma transformação – para ter certeza de obter o valor correto que você precisa para recuperar o código através de programação do sistema – fornecerei um script para isso em breve.No entanto, o UpgradeCode encontrado no MSI em cache é geralmente correto ).

Para abrir os arquivos MSI armazenados em cache, use o Orca ou outra ferramenta de empacotamento. Aqui está uma discussão de diferentes ferramentas (qualquer uma delas fará): Que produto de instalação usar? InstallShield, WiX, Wise, Instalador Avançado, etc. Se você não tiver essa ferramenta instalada, sua aposta mais rápida pode ser tentar o Super Orca (é simples de usar, mas não é extensivamente testado por mim).

UPDATE : aqui está uma nova resposta com informações sobre vários produtos gratuitos que você pode usar para visualizar arquivos MSI: Como posso comparar o conteúdo de dois (ou mais) arquivos MSI?

Se você tiver o Visual Studio instalado , tente procurar por Orca-x86_en-us.msi – em Program Files (x86) – e instale-o (este é o visualizador e editor MSI oficial da Microsoft). Então encontre Orca no menu iniciar. Vá a tempo em nenhum momento :-). Tecnicamente Orca é instalado como parte do Windows SDK (não Visual Studio), mas o Windows SDK é fornecido com a instalação do Visual Studio. Se você não tiver o Visual Studio instalado , talvez conheça alguém que tenha? Basta fazer com que eles procurem esse MSI e enviem a você (é um minúsculo arquivo mb) – eles devem levar segundos. UPDATE : você precisa de vários arquivos CAB, bem como o MSI – estes são encontrados na mesma pasta onde o MSI é encontrado. Se não, você pode sempre baixar o SDK do Windows (ele é gratuito, mas é grande – e tudo o que você instalar atrasará o seu PC). Não tenho certeza de qual parte do SDK instala o MSI Orca. Se você fizer isso, basta editar e adicionar detalhes aqui.


  • Aqui está um artigo mais abrangente sobre a questão da desinstalação do MSI: Desinstalando um arquivo MSI da linha de comando sem usar msiexec
  • Aqui está um artigo semelhante com algumas outras opções para recuperar informações MSI usando o registro ou o msi em cache: Localizar GUID do arquivo MSI ?

Tópicos semelhantes (para referência e access fácil – eu deveria limpar esta lista):

  • Como encontrar o UpgradeCode e ProductCode de um aplicativo instalado no Windows 7
  • Como posso encontrar o código de atualização para um aplicativo instalado em c #?
  • Wix: como desinstalar o aplicativo instalado anteriormente que é instalado usando o instalador diferente
  • WiX – Fazendo uma atualização importante em uma instalação de várias instâncias
  • como descobrir quais produtos estão instalados – produtos mais novos já estão instalados janelas MSI (usando VBScript)
  • Como desinstalar com msiexec usando o ID de produto guid sem arquivo .msi presente
  • Encontre o GUID do pacote MSI
    Intereting Posts