Cómo averiguar a qué paquete de instalación pertenece un exe / dll dado

11

Me gustaría saber qué MSI instaló un dll o exe determinado en mi sistema. Sé que Windows corrige los archivos eliminados si pertenecen a un paquete instalado. ¿Puedo consultar esa información sin eliminar realmente el archivo? ¿Existe una herramienta o API Win32 para verificar a qué paquete pertenece un archivo?

wigy
fuente

Respuestas:

7

¡Parece que después de todo podría haber una manera! Recientemente descubrí entradas de registro para archivos instalados por Windows Installer en el siguiente subárbol:

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

Escribí un pequeño script de Python para buscar el instalador de un archivo usando la información almacenada allí:

> 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á disponible aquí: https://github.com/Zero3/windows-installer-file-search

Zero3
fuente
Guau. 2.5 años después, usted formuló esta pregunta. Mirando ese subárbol, ahora entiendo por qué lleva tanto tiempo iniciar Windows. Esto debe indexarse ​​en la memoria para que la función "su aplicación esté dañada, inserte el disco" para que funcione en cada ejecución de una aplicación.
wigy
6

Si está de acuerdo con solo encontrar agujas plausibles en el pajar, este abuso rápido y sucio de 7-Zip funcionará:

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

Luego abra needlelist.txten cualquier editor de texto, busque needlename.dlly encontrará el paquete .msi correspondiente en los listados generados por 7-Zip.

(Nota: Este método es 'sucio' porque solo te dice qué paquetes .msi contienen un archivo llamado needlename.dll. Pero probablemente esté bien para la mayoría de los casos de uso).

Zero3
fuente
De hecho, este es un abuso inteligente de 7-Zip. ¿El instalador siempre copia el MSI a esa carpeta C: \ Windows \ Installer o es solo una convención que podría eludirse? Todavía estoy esperando una elegante API Win32 antes de aceptar el hecho de que no hay otra manera (y aceptar su respuesta).
wigy
AFAIK Windows Installer siempre almacena en caché los MSI instalados en la carpeta (consulte también superuser.com/questions/473569/… ). La razón de esto es lógica: el instalador también es el desinstalador. Por lo tanto, Windows necesita una copia del desinstalador en una ubicación conocida para ejecutarlo cuando el usuario desea desinstalar la aplicación. Como el MSI original probablemente se eliminó hace mucho tiempo en este momento, Windows guarda una copia durante la instalación.
Zero3
Con respecto a una API: a diferencia de la mayoría de las distribuciones de Linux (y similares), Windows (al menos antes de Windows 8) no tiene un sistema de administración de paquetes adecuado integrado en el sistema operativo, capaz de consultar cosas como esta. Probablemente se podría crear una aplicación para hacer esto ejecutando todos los MSI instalados y buscando dentro de ellos el archivo de destino (esencialmente mi respuesta implementada correctamente), pero esto no parece implementarse de manera inmediata. Podría estar equivocado, por supuesto.
Zero3
Bueno, lo acepto como respuesta. Aunque no podemos probar que no haya una API Win32 para esto, mi sensación fue que MSI de alguna manera se enganchó en el proceso de carga sin una API pública adecuada.
wigy