Como descobrir a qual pacote de instalação um determinado exe / dll pertence

11

Gostaria de saber o que o MSI instalou uma determinada dll ou exe no meu sistema. Eu sei que o Windows corrige arquivos excluídos se eles pertencerem a um pacote instalado. Posso consultar essas informações sem realmente excluir o arquivo? Existe uma ferramenta ou API do Win32 para verificar a qual pacote um arquivo pertence?

peruca
fonte

Respostas:

7

Parece que pode haver uma maneira, afinal! Descobri recentemente as entradas do Registro para arquivos instalados pelo Windows Installers sob a seguinte subárvore:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData

Eu escrevi um pequeno script Python para procurar um arquivo no instalador usando as informações armazenadas lá:

> python windows-installer-file-search.py opus.dll
File: C:\Program Files (x86)\Mumble\opus.dll
Product: Mumble 1.2.13
Install user: S-1-5-18
Cached installer: C:\Windows\Installer\2f6b072.msi

Está disponível aqui: https://github.com/Zero3/windows-installer-file-search

Zero3
fonte
Uau. 2,5 anos depois, você acertou esta questão. Olhando para essa subárvore, agora entendo por que demora tanto tempo para inicializar o Windows. Isso deve ser indexado na memória para que o recurso "seu aplicativo esteja corrompido, insira o disco" funcione em todas as execuções de um aplicativo.
Wigy
6

Se você estiver bem em encontrar agulhas plausíveis no palheiro, esse abuso rápido e sujo do 7-Zip funcionará:

7z.exe l -an -air!C:\Windows\Installer\*.msi > needlelist.txt

Em seguida, abra needlelist.txtem qualquer editor de texto, procure needlename.dlle você encontrará o pacote .msi correspondente nas listagens geradas pelo 7-Zip.

(Nota: esse método é 'sujo' porque apenas informa quais pacotes .msi que contêm um arquivo chamado needlename.dll. Mas provavelmente é bom para a maioria dos casos de uso.)

Zero3
fonte
Na verdade, este é um abuso inteligente do 7-Zip. O instalador sempre copia o MSI para essa pasta C: \ Windows \ Installer ou é apenas uma convenção que pode ser contornada? Ainda estou esperando por uma elegante API do Win32 antes de aceitar o fato de que não há outra maneira (e aceitar sua resposta).
Wigy
O AFAIK Windows Installer sempre armazena em cache os MSIs instalados na pasta (consulte também superuser.com/questions/473569/… ). A razão para isso é lógica: o instalador também é o desinstalador. O Windows precisa, portanto, de uma cópia do desinstalador em um local conhecido para executá-lo quando o usuário desejar desinstalar o aplicativo. Como o MSI original provavelmente já foi excluído há muito tempo, neste momento, o Windows salva uma cópia durante a instalação.
Zero3
Em relação a uma API: Diferentemente da maioria das distribuições Linux (e similares), o Windows (pelo menos antes do Windows 8) não possui um sistema de gerenciamento de pacotes adequado incorporado ao sistema operacional, capaz de consultar coisas como essa. Provavelmente, é possível criar um aplicativo para fazer isso executando todos os MSIs instalados e procurar dentro deles o arquivo de destino (essencialmente minha resposta foi implementada corretamente), mas isso não parece ter sido implementado imediatamente. Eu posso estar errado, é claro.
Zero3
Bem, eu aceito isso como resposta. Embora não possamos provar que não existe uma API Win32 para isso, minha impressão é que o MSI de alguma forma se conectou ao carregamento do processo sem uma API pública adequada.
Wigy