Como posso encontrar o GUIA de produto de uma configuração MSI instalada?

Preciso de encontrar o guia de produto para um arquivo MSI instalado, a fim de efectuar manutenção como patching, uninstall ([como desinstalar]1) e também para **auditoria***.

Solução

Para **código de actualização* recuperação: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095**

Versão curta

A informação abaixo cresceu consideravelmente ao longo do tempo e pode ter-se tornado um pouco elaborada demais. Como obter códigos de produtos rapidamente? (quatro abordagens):

  1. Use o Powershell "one-liner"`

    Rollar para baixo para captura de ecrã e passo-a-passo. Aviso também abaixo - riscos menores ou moderados, dependendo de quem perguntar. Funciona bem para mim. Qualquer self-reparação desencadeada por esta opção deverá geralmente ser possível de cancelar. Os verificações de integridade do pacote accionados adicionam algum log "noise" no entanto. **Nota*! O "IdentifyingNumber" é** o "ProductCode" (WMI peculiaridade).

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

Início rápido do Powershell: hold Windows key, tap R, digite in "powerhell" e prima Enter 2. Usar VBScript

Descrito abaixo em "Alternative Tools" (secção 3). Esta opção pode ser safer do que Powershell por razões explicadas em detalhe abaixo. Na sua essência é (muito) **mais rápido** e não é capaz de desencadear a auto-reparação MSI uma vez que não passa pela WMI (acede directamente à MSI COM API - à velocidade de bolhas). No entanto, está mais envolvido do que a opção Powershell* (várias linhas de código). 3. Consulta do Ministério

Alguns juram ao procurar coisas no registo. Não é a minha abordagem recomendada - gosto de passar por APIs apropriados (ou por outras palavras: chamadas de funções de SO). Há sempre estranhas excepções contabilizadas apenas pelos internos da implementação do API:

  • HKLMSOFTWAREMicrosoftWindowsCurrentVersion`Uninstall
  • HKLM`SOFTWARE\WOW6432Node\MicrosoftWindows\CurrentVersion=Desinstalar
  • HKCU Software Software Microsoft Windows Versão actual Desinstalar
  1. "Arquivo MSI original / Fonte WiX".

    Pode encontrar o Código do produto na Tabela de propriedades` de qualquer ficheiro MSI (e de qualquer outra propriedade também). No entanto, o GUID poderia ser (raramente) anulado por uma transformação aplicada no momento da instalação e, portanto, não corresponder ao GUID em que o produto está registado (a abordagem 1 e 2 acima relatará o código real do produto - que está registado no Windows - em cenários tão raros). É preciso uma ferramenta para visualizar os ficheiros MSI. Veja no final da seguinte resposta para uma lista de ferramentas gratuitas que pode descarregar (ou veja a opção rápida abaixo): https://stackoverflow.com/questions/48482545/how-can-i-compare-the-content-of-two-or-more-msi-files/48482546#48482546 UPDATE: Para conveniência e necessidade de velocidade :-), descarregue SuperOrca sem demora e sem alarido a partir de este hotlink de descarga directa - a ferramenta é suficientemente boa para fazer o trabalho - instale, abra o MSI e vá directamente para a tabela de propriedades e encontre a linha ProductCode (por favor verifique sempre um hotlink de descarga directa - obviamente - pode utilizar virustotal.com para o fazer - verificação online utilizando dezenas de conjuntos de anti-vírus e malware para verificar o que carrega).

    Orca é uma ferramenta própria da Microsoft's, é instalada com Visual Studio e o Windows SDK. Tente procurar por Orca-x86_en-us.msi - em **Arquivos de programa (x86)*** e instalar o MSI se encontrado.

    E abaixo encontrará a resposta original que "organicamente cresceu" em muitos detalhes. Talvez ver "Desinstalar pacotes MSI" secção abaixo se esta é a tarefa que precisa de executar.

    Recuperar Códigos de Produto

    UPDATE: Se também precisar do código de actualização, verifique esta resposta: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095 (recupera códigos de produtos associados, códigos de actualização & nomes de produtos em uma saída de tabela - semelhante à que se segue).

    • Can't utilizar PowerShell? Ver "Ferramentas alternativas" secção abaixo.
    • Procura para desinstalar? Ver "Desinstalar pacotes MSI" secção abaixo. Incendeie Powershell* (apagar a tecla Windows, tocar em R, soltar a tecla Windows, digitar "powerhell" e pressionar OK) e executar o comando abaixo para obter uma lista dos pacotes MSI instalados códigos de produto* juntamente com o caminho do pacote de cache local e o **nome do produto*** (maximizar a janela PowerShell para evitar nomes truncados). Antes de executar esta linha de comando, leia por favor o aviso abaixo (nada perigoso, apenas alguns potenciais incómodos). Secção 3 em "Ferramentas Alternativas" mostra uma forma alternativa não consular de obter a mesma informação utilizando VBScript. Se estiver a tentar desinstalar um pacote, existe uma secçã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 esta: Por alguma estranha razão o "ProductCode" é referido como "IdentifyingNumber" no WMI*. Por outras palavras - na imagem acima o número de identificação é o Código de Produto. Se precisar de executar esta consulta remotamente contra lotes de computadores remotos*, ver "Retrieve Product Codes From A Remote Computer*" secção abaixo.

DISCLAIMER (importante, leia por favor antes de executar o comando!): Devido ao estranho desenho da Microsoft, qualquer chamada WMI para "Win32_Product" (Produto). (como o comando PowerShell abaixo) irá desencadear uma validação do pacote de bens. Para além de ser quite lento, isto pode, em casos raros desencadear uma auto-reparação MSI. Este pode ser um pequeno pacote ou algo do género enorme - como o Visual Studio. Na maioria dos casos, isto não acontece - mas há um risco. Don't executar este comando mesmo antes de um importante reunião - não é nunca perigosa (é apenas de leitura), mas pode levar a uma longa reparação em casos muito raros (penso que pode cancelar o auto-reparação também - a menos que o pacote em questão o impeça activamente, mas será reiniciado se chamar Win32_Product mais uma vez e isto persistirá até deixar a auto-reparação terminar - por vezes pode continuar mesmo que a deixe terminar: https://stackoverflow.com/questions/5501028/how-can-i-determine-what-causes-repeated-windows-installer-self-repair/6066263#6066263).

e só para que conste: algumas pessoas informam que os seus registos de eventos são preenchidos com entradas MsiInstaller EventID 1035 (ver resposta do chefe de código's) - aparentemente causado por consultas WMI à classe Win32_Product (pessoalmente nunca vi isto). Isto é não directamente relacionado com o comando Powershell sugerido acima, está no contexto do uso geral da classe Win32_Product do WIM. Também se pode obter a saída em forma de lista (em vez de tabela):

get-wmiobject -class Win32_Product

Neste caso, a produção é semelhante a esta:

Recuperar Códigos de Produtos de um Computador Remoto

Em teoria, só deve ser possível especificar um nome de computador remoto como parte do próprio comando. Aqui está o mesmo comando acima definido para correr na máquina "RemoteMachine" (secção ``-ComputerName RemoteMachine'' acrescentada):

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

Isto pode funcionar se estiver a correr com direitos de administrador de domínio num domínio adequado. Num ambiente de grupo de trabalho (pequeno escritório / rede doméstica), provavelmente terá de adicionar credenciais de utilizador directamente às chamadas WMI para o fazer funcionar. Além disso, as ligações remotas na WMI são afectadas por (pelo menos) Windows Firewall, DCOM settings, e User Account Control (UAC) (mais quaisquer factores adicionais não-Microsoft - por exemplo microsoft firewalls reais, third party software firewalls, **software de segurança de vários tipos***, etc...). Se vai funcionar ou não depende da sua configuração exacta.

  • Configurar uma ligação WMI remota
  • Ligação remota ao WMI com PowerShell **UPDATE***: Uma secção extensa sobre o funcionamento remoto do WMI pode ser encontrada nesta resposta: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095. Parece uma regra de firewall e a supressão da solicitação UAC através de um ajuste de registo pode fazer com que as coisas funcionem num ambiente de rede de grupo de trabalho. Não é recomendado alterar em termos de segurança, mas funcionou para mim.

    Ferramentas alternativas

    PowerShell requer a instalação do .NET framework (actualmente na versão 3.5.1 parece? Outubro, 2017). A própria aplicação PowerShell ** também pode estar em falta* da máquina, mesmo que o .NET esteja instalado. Finalmente, acredito que o PowerShell pode ser desabilitado ou bloqueado por várias políticas e privilégios do sistema. Se for este o caso, pode tentar algumas outras formas de recuperar códigos de produtos. A minha alternativa preferida é VBScript** - é rápido e flexível (mas também pode ser bloqueado em certas máquinas, e o scripting está sempre um pouco mais envolvido do que a utilização de ferramentas).

  1. Let's start with a **built-in Windows WMI tool***: ``wbemtest.exe```.
  • Inicie ``wbemtest.exe``` (Segure a tecla Windows, toque em R, solte a tecla Windows, digite "wbemtest.exe" e prima OK).
  • Clique connect e depois OK (namespace default to root\cimv2), e clique em "connect" novamente.
  • Clique "query" e digite este **comandoWQL*** (sabor SQL): "SELECT IdentifyingNumber,Name,Version FROM Win32_Product" e clique "Use" (ou equivalente - a ferramenta será localizada).
  • Exemplo de imagem do ecrã de saída (truncado). Não é a formatação mais agradável, mas pode obter os dados de que necessita. **IdentifyingNumber é o código de produto MSI***:
  1. A seguir, pode experimentar uma ferramenta WMI personalizada, mais completa, como "WMIExplorer.exe".
  • Isto não está incluído no Windows. É, no entanto, uma ferramenta muito boa. Recomendado.
  • Consulte-o em: https://github.com/vinaypamnani/wmie2/releases
  • Iniciar a ferramenta, clicar em Connect, duplo clique ROOT\CIMV2
  • A partir do "Guia de consulta", escreva na seguinte consulta SELECT IdentifyingNumber,Name,Version FROM Win32_Product e prima Execute.
  • Screenshot pulado, a aplicação requer demasiados imóveis no ecrã.
  1. Finalmente pode tentar um VBScript para aceder à informação através de a interface de automatização MSI (característica central do Windows - é não relacionada com WMI).
  • Copie o script abaixo e cole num ficheiro *.vbs no seu ambiente de trabalho, e tente executá-lo com um duplo clique. A sua área de trabalho deve ser gravável para si, ou pode utilizar qualquer outro local gravável.
  • Este não é um grande script VBScript. Privilegiou-se a concatenação em vez do tratamento de erros e da integridade, mas deve fazer o trabalho com o mínimo de complexidade.
  • O ficheiro de saída é criado na pasta de onde se executa o script (**pasta deve ser gravável***). O ficheiro de saída é chamado ``msiinfo.csv```.
  • Faça duplo clique no ficheiro para abrir numa aplicação de folha de cálculo, seleccione vírgula como delimitador na importação - OU - basta abrir o ficheiro no Bloco de Notas ou em qualquer visualizador de texto.
  • A abertura numa folha de cálculo permitirá funcionalidades avançadas de ordenação.
  • Este script pode ser facilmente adaptado para mostrar uma quantidade significativa de mais detalhes sobre a instalação do MSI. Uma demonstração disto pode ser encontrada aqui: https://stackoverflow.com/questions/28963089/how-to-find-out-which-products-are-installed-newer-product-are-already-install/28971679#28971679.
' 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

posso'não pense em mais opções de uso geral para recuperar códigos de produtos neste momento, por favor acrescente se souber de alguma. **Editar apenas em linha*** em vez de acrescentar demasiados comentários, por favor.

Pode certamente aceder a esta informação a partir da sua candidatura chamando a interface de automação MSI (baseada na COM) OU o C++ funções do instalador MSI (Win32 API). Ou mesmo utilizar consultas WMI de dentro da sua aplicação como nas amostras acima utilizando PowerShell```,wbemtest.exeouWMIExplorer.exe```.

Desinstalar pacotes MSI

Se o que pretende fazer é desinstalar o pacote MSI para o qual encontrou o código do produto, pode fazê-lo da seguinte forma usando uma alerta de comando elevada (procure por cmd.exe, clique com o botão direito do rato e executar como administrador): Opção 1**: Basic, desinstalação interactiva sem registo*** (rápida e fácil):

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

Explicação rápida dos parâmetros:

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

Também pode activar o registo (verboso) e correr em modo silencioso se o desejar, levando-nos à opção 2: Opção 2**: Desinstalação silenciosa com registo verboso*** (melhor para ficheiros de lote):

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

Explicação rápida dos parâmetros:

/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

Existe aqui uma compreensiva referência para a desinstalação do MSI (várias formas diferentes de desinstalação de pacotes MSI): https://stackoverflow.com/questions/450027/uninstalling-an-msi-file-from-the-command-line-without-using-msiexec/1055933#1055933. Há uma infinidade de diferentes maneiras de desinstalar. Se estiver a escrever um ficheiro de lote, dê uma vista de olhos à secção 3 acima, com uma resposta ligada 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) (resumo da linha de comando para msiexec.exe da MSDN). E a versão Technet também.

Recuperação de outras propriedades / informações MSI (f.ex Código de actualização)

UPDATE: por favor encontre uma nova resposta sobre como encontrar o código de actualização para pacotes instalados em vez de procurar manualmente o código nos ficheiros MSI. Para pacotes instalados isto é muito mais fiável. Se o pacote não for instalado, ainda precisa de procurar no ficheiro MSI (ou no ficheiro fonte utilizado para compilar o MSI) para encontrar o código de actualização. Deixando na secção mais antiga abaixo: Se quiser obter o UpgradeCode ou outras propriedades MSI, pode abrir o MSI de instalação em cache para o produto a partir do local especificado por "LocalPackage" na mostra de imagem acima (algo parecido: "C:|WINDOWS\Installer\50c080ae.msi- é um nome de ficheiro hexadecimal, único em cada sistema). Depois procura no "** Tabela de propriedade**" para UpgradeCode (é possível que o UpgradeCode seja redefinido numa transformação - para ter a certeza de que obtém o valor certo que precisa para recuperar o código programticamente do sistema - fornecerei um script para isto em breve. No entanto, **o UpgradeCode encontrado no MSI em cache é geralmente correcto**). Para abrir os ficheiros MSI em cache, utilizar **[Orca][18]** ou outra ferramenta de embalagem. Aqui está uma discussão de diferentes ferramentas (qualquer uma delas serve): https://stackoverflow.com/questions/1544292/what-installation-product-to-use-installshield-wix-wise-advanced-installer/1546941#1546941. Se não'não tiver tal ferramenta instalada, a sua aposta mais rápida pode ser tentar [Super Orca][4] (é simples de usar, mas não foi testado exaustivamente por mim). **UPDATE**: aqui está uma nova resposta com informações sobre vários produtos gratuitos que pode utilizar para ver os ficheiros MSI: https://stackoverflow.com/questions/48482545/how-can-i-compare-the-content-of-two-or-more-msi-files/48482546#48482546 **Se tiver o Visual Studio instalado***, tente procurar por ``Orca-x86_en-us.msi - em Arquivos de Programas (x86) - e instale-o (este é o próprio Microsoft's, visualizador e editor oficial do MSI). Depois encontrar Orca no menu inicial. Vá a tempo em pouco tempo :-). Tecnicamente, o Orca é instalado como parte do Windows SDK (não do Visual Studio), mas o Windows SDK é empacotado com a instalação do Visual Studio. **Se não'não tem o Visual Studio instalado*, talvez conheça alguém que o faça? Basta que procure este MSI e o envie (é um pequeno ficheiro de meio mb) - deve demorar segundos. UPDATE**: precisa de vários ficheiros CAB bem como do MSI - estes são encontrados na mesma pasta onde o MSI é encontrado. Caso contrário, pode sempre descarregar o Windows SDK (é gratuito, mas é grande - e tudo o que instalar irá atrasar o seu PC). Não tenho a certeza de qual parte do SDK instala o Orca MSI. Se o fizer, basta editar e adicionar detalhes aqui.

Comentários (6)

Se tiver demasiados instaladores para encontrar facilmente o que procura, aqui está uma concha de poder para fornecer um filtro e reduzi-lo um pouco por nome de exibição.

$filter = "*core*sdk*"; (Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall).Name | % { $path = "Registry::$_"; Get-ItemProperty $path } | Where-Object { $_.DisplayName -like $filter } | Select-Object -Property DisplayName, PsChildName
Comentários (0)