So finden Sie heraus, zu welchem ​​Installationspaket eine bestimmte exe / dll gehört

11

Ich möchte wissen, welche MSI eine bestimmte DLL oder Exe auf meinem System installiert hat. Ich weiß, dass Windows gelöschte Dateien repariert, wenn sie zu einem installierten Paket gehören. Kann ich diese Informationen abfragen, ohne die Datei tatsächlich zu löschen? Gibt es ein Tool oder eine Win32-API, um zu überprüfen, zu welchem ​​Paket eine Datei gehört?

Perücke
quelle

Antworten:

7

Es scheint, als gäbe es doch einen Weg! Ich habe kürzlich Registrierungseinträge für Dateien entdeckt, die von Windows Installers unter dem folgenden Teilbaum installiert wurden:

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

Ich habe ein kleines Python-Skript geschrieben, um das Installationsprogramm anhand der dort gespeicherten Informationen nach einer Datei zu durchsuchen:

> 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

Es ist hier verfügbar: https://github.com/Zero3/windows-installer-file-search

Null3
quelle
Beeindruckend. 2,5 Jahre später haben Sie diese Frage gestellt. Wenn ich mir diesen Teilbaum anschaue, verstehe ich jetzt, warum das Starten von Windows so lange dauert. Dies muss im Speicher indiziert werden, damit die Funktion "Ihre Anwendung ist beschädigt, Datenträger einlegen" bei jeder Ausführung einer Anwendung funktioniert.
Perücke
6

Wenn Sie nur plausible Nadeln im Heuhaufen finden können, funktioniert dieser schnelle und schmutzige Missbrauch von 7-Zip :

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

Öffnen Sie dann needlelist.txtin einem beliebigen Texteditor, suchen Sie nach needlename.dllund Sie finden das entsprechende .msi-Paket in den von 7-Zip generierten Listen.

(Hinweis: Diese Methode ist "schmutzig", da sie nur angibt, welche MSI-Pakete eine Datei mit dem Namen enthalten needlename.dll. Für die meisten Anwendungsfälle ist sie jedoch wahrscheinlich in Ordnung.)

Null3
quelle
In der Tat ist dies ein kluger Missbrauch von 7-Zip. Kopiert das Installationsprogramm die MSI immer in diesen Ordner C: \ Windows \ Installer oder handelt es sich nur um eine Konvention, die möglicherweise umgangen wird? Ich warte immer noch auf eine elegante Win32-API, bevor ich akzeptiere, dass es keinen anderen Weg gibt (und Ihre Antwort akzeptiere).
Perücke
AFAIK Windows Installer speichert installierte MSIs immer im Ordner zwischen (siehe auch superuser.com/questions/473569/… ). Der Grund dafür ist logisch: Das Installationsprogramm ist auch das Deinstallationsprogramm. Windows benötigt daher eine Kopie des Deinstallationsprogramms an einem bekannten Speicherort, um es ausführen zu können, wenn der Benutzer die Anwendung deinstallieren möchte. Da das ursprüngliche MSI zu diesem Zeitpunkt wahrscheinlich schon vor langer Zeit gelöscht wurde, speichert Windows während der Installation eine Kopie.
Zero3
In Bezug auf eine API: Im Gegensatz zu den meisten Linux-Distributionen (und dergleichen) verfügt Windows (zumindest vor Windows 8) nicht über ein ordnungsgemäßes Paketverwaltungssystem, das in das Betriebssystem integriert ist und nach solchen Dingen abfragen kann. Man könnte wahrscheinlich eine Anwendung erstellen, um dies zu tun, indem man alle installierten MSIs durchläuft und in ihnen nach der Zieldatei sucht (im Wesentlichen meine Antwort wurde ordnungsgemäß implementiert), aber dies scheint nicht sofort implementiert zu sein. Ich könnte mich natürlich irren.
Zero3
Nun, ich akzeptiere es als Antwort. Obwohl wir nicht beweisen können, dass es dafür keine Win32-API gibt, hatte ich das Gefühl, dass MSI irgendwie in das Laden des Prozesses ohne eine ordnungsgemäße öffentliche API eingebunden ist.
Perücke