Comment savoir à quel package d'installation appartient un fichier exe / dll donné

11

Je voudrais savoir quel MSI a installé une DLL ou un exe donné sur mon système. Je sais que Windows corrige les fichiers supprimés s'ils appartiennent à un package installé. Puis-je interroger ces informations sans supprimer le fichier? Existe-t-il un outil ou une API Win32 pour vérifier à quel package appartient un fichier?

perruque
la source

Réponses:

7

Il semble qu'il puisse y avoir un moyen après tout! J'ai récemment découvert des entrées de registre pour les fichiers installés par les programmes d'installation de Windows sous le sous-arbre suivant:

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

J'ai écrit un petit script Python pour rechercher le programme d'installation d'un fichier en utilisant les informations stockées là-bas:

> 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

Il est disponible ici: https://github.com/Zero3/windows-installer-file-search

Zero3
la source
Sensationnel. 2,5 ans plus tard, vous avez résolu cette question. En regardant ce sous-arbre, je comprends maintenant pourquoi il faut autant de temps pour démarrer Windows. Celui-ci doit être indexé en mémoire pour que la fonction «votre application est corrompue, insérez le disque» fonctionne à chaque exécution d'une application.
wigy
6

Si vous êtes d'accord pour simplement trouver des aiguilles plausibles dans la botte de foin, cet abus rapide et sale de 7-Zip fonctionnera:

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

Ensuite, ouvrez needlelist.txtdans n'importe quel éditeur de texte, recherchez needlename.dllet vous trouverez le package .msi correspondant dans les listes générées par 7-Zip.

(Remarque: cette méthode est «sale» car elle vous indique simplement quels packages .msi contiennent un fichier nommé needlename.dll. Mais cela convient probablement à la plupart des cas d'utilisation.)

Zero3
la source
En effet, il s'agit d'un abus intelligent de 7-Zip. Le programme d'installation copie-t-il toujours le MSI dans ce dossier C: \ Windows \ Installer ou s'agit-il simplement d'une convention qui pourrait être contournée? J'attends toujours une élégante API Win32 avant d'accepter le fait qu'il n'y a pas d'autre moyen (et d'accepter votre réponse).
wigy
AFAIK Windows Installer met toujours en cache les MSI installés dans le dossier (voir également superuser.com/questions/473569/… ). La raison en est logique: le programme d'installation est également le programme de désinstallation. Windows a donc besoin d'une copie du programme de désinstallation dans un emplacement connu afin de l'exécuter lorsque l'utilisateur souhaite désinstaller l'application. Comme le MSI d'origine a probablement été supprimé il y a longtemps à ce stade, Windows enregistre une copie lors de l'installation.
Zero3
Concernant une API: contrairement à la plupart des distributions Linux (et similaires), Windows (avant Windows 8, au moins) n'a pas de système de gestion de packages approprié intégré au système d'exploitation, capable d'interroger des choses comme celle-ci. On pourrait probablement créer une application pour ce faire en parcourant tous les MSI installés et en recherchant à l'intérieur le fichier cible (essentiellement ma réponse implémentée correctement), mais cela ne semble pas être implémenté immédiatement. J'ai peut-être tort, bien sûr.
Zero3
Eh bien, je l'accepte comme réponse. Bien que nous ne puissions pas prouver qu'il n'y a pas d'API Win32 pour cela, mon sentiment était que MSI était en quelque sorte accroché au chargement du processus sans une API publique appropriée.
wigy