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
***.
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):
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
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:
SOFTWARE
MicrosoftWindows
CurrentVersion`UninstallPode 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
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.
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).
SELECT IdentifyingNumber,Name,Version FROM Win32_Product
e prima Execute.' 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.exeou
WMIExplorer.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
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
- emArquivos 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.
Tópicos semelhantes (para referência e fácil acesso - devo limpar esta lista):
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