Come scoprire a quale pacchetto di installazione appartiene un dato exe / dll


11

Vorrei sapere quale MSI ha installato una determinata dll o exe sul mio sistema. So che Windows corregge i file eliminati se appartengono a un pacchetto installato. Posso richiedere tali informazioni senza eliminare effettivamente il file? Esiste uno strumento o un'API Win32 per verificare a quale pacchetto appartiene un file?

Risposte:


7

Sembra che dopo tutto potrebbe esserci un modo! Recentemente ho scoperto le voci di registro per i file installati dagli installatori di Windows con la seguente sottostruttura:

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

Ho scritto un piccolo script Python per cercare il file di installazione per un file utilizzando le informazioni memorizzate 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

È disponibile qui: https://github.com/Zero3/windows-installer-file-search


Wow. 2,5 anni dopo hai inchiodato questa domanda. Guardando quella sottostruttura, ora capisco perché ci vuole così tanto tempo per avviare Windows. Questo deve essere indicizzato in memoria per la funzione "l'applicazione è danneggiata, inserire il disco" per funzionare su ogni esecuzione di un'applicazione.
parrucca

6

Se stai bene nel trovare solo aghi plausibili nel pagliaio, questo abuso rapido e sporco di 7-Zip funzionerà:

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

Quindi apri needlelist.txtin qualsiasi editor di testo, cerca needlename.dlle troverai il corrispondente pacchetto .msi negli elenchi generati da 7-Zip.

(Nota: questo metodo è 'sporco' perché ti dice solo quali pacchetti .msi che contengono un file chiamato needlename.dll. Ma probabilmente va bene per la maggior parte dei casi d'uso.)


In effetti, questo è un abuso intelligente di 7-Zip. Il programma di installazione copia sempre l'MSI nella cartella C: \ Windows \ Installer o è solo una convenzione che potrebbe essere aggirata? Sto ancora aspettando un'elegante API Win32 prima di accettare il fatto che non c'è altro modo (e di accettare la tua risposta).
parrucca

AFAIK Windows Installer memorizza sempre nella cache gli MSI installati (vedere anche superuser.com/questions/473569/… ). Il motivo è logico: il programma di installazione è anche il programma di disinstallazione. Windows ha quindi bisogno di una copia del programma di disinstallazione in un percorso noto per eseguirlo quando l'utente desidera disinstallare l'applicazione. Poiché l'MSI originale è stato probabilmente eliminato anni fa a questo punto, Windows ne salva una copia durante l'installazione.
Zero3,

Per quanto riguarda un'API: a differenza della maggior parte delle distro Linux (e simili), Windows (almeno prima di Windows 8) non ha un sistema di gestione dei pacchetti adeguato integrato nel sistema operativo, in grado di eseguire query per cose come questa. Probabilmente si potrebbe creare un'applicazione per farlo eseguendo tutti gli MSI installati e cercare al loro interno il file di destinazione (essenzialmente la mia risposta implementata correttamente), ma questo non sembra essere implementato immediatamente. Potrei sbagliarmi, ovviamente.
Zero3,

Bene, lo accetto come una risposta. Anche se non possiamo dimostrare che non esiste un'API Win32 per questo, la mia sensazione era che MSI in qualche modo si agganciasse al caricamento del processo senza un'API pubblica appropriata.
parrucca dal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.