Jak dowiedzieć się, do którego pakietu instalacyjnego należy dany plik exe / dll

11

Chciałbym wiedzieć, co MSI zainstalowało dll lub exe w moim systemie. Wiem, że Windows naprawia usunięte pliki, jeśli należą one do zainstalowanego pakietu. Czy mogę zapytać o te informacje bez usuwania pliku? Czy istnieje narzędzie lub interfejs API Win32, aby sprawdzić, do którego pakietu należy plik?

wigy
źródło

Odpowiedzi:

7

Wygląda na to, że w końcu może być jakiś sposób! Niedawno odkryłem wpisy rejestru dotyczące plików instalowanych przez Instalatory Windows w następującym poddrzewie:

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

Napisałem mały skrypt w języku Python, aby wyszukać plik instalatora za pomocą przechowywanych tam informacji:

> 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

Jest dostępny tutaj: https://github.com/Zero3/windows-installer-file-search

Zero3
źródło
Łał. 2,5 roku później przybiłeś to pytanie. Patrząc na to poddrzewo, teraz rozumiem, dlaczego uruchomienie systemu Windows zajmuje tyle czasu. Należy to zindeksować w pamięci, aby funkcja „Twoja aplikacja była uszkodzona, włóż dysk”, aby działała przy każdym uruchomieniu aplikacji.
wigy
6

Jeśli nie masz nic przeciwko znalezieniu prawdopodobnych igieł w stogu siana, to szybkie i brudne nadużycie 7-Zip zadziała:

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

Następnie otwórz needlelist.txtw dowolnym edytorze tekstu, wyszukaj, needlename.dlla znajdziesz odpowiedni pakiet .msi w listach wygenerowanych przez 7-Zip.

(Uwaga: ta metoda jest „brudna”, ponieważ informuje tylko, które pakiety .msi zawierają plik o nazwie needlename.dll. Ale prawdopodobnie jest odpowiednia w większości przypadków.)

Zero3
źródło
Rzeczywiście, jest to sprytne nadużycie 7-Zip. Czy instalator zawsze kopiuje plik MSI do tego folderu C: \ Windows \ Installer, czy jest to tylko konwencja, którą można obejść? Nadal czekam na elegancki interfejs API Win32, zanim zaakceptuję fakt, że nie ma innego wyjścia (i zaakceptuję twoją odpowiedź).
wigy
Instalator Windows AFAIK zawsze buforuje zainstalowane pliki MSI w folderze (patrz także superuser.com/questions/473569/… ). Powód jest logiczny: instalator jest również dezinstalatorem. System Windows potrzebuje zatem kopii dezinstalatora w znanej lokalizacji, aby wykonać go, gdy użytkownik chce odinstalować aplikację. Ponieważ oryginalny plik MSI został prawdopodobnie usunięty przed wiekami, system Windows zapisuje kopię podczas instalacji.
Zero3,
Odnośnie interfejsu API: W przeciwieństwie do większości dystrybucji Linuksa (i tym podobnych), system Windows (przynajmniej wcześniejszy niż Windows 8) nie ma wbudowanego odpowiedniego systemu zarządzania pakietami w systemie operacyjnym, zdolnego do wysyłania zapytań o takie rzeczy. Prawdopodobnie można by to zrobić, uruchamiając wszystkie zainstalowane pliki MSI i wyszukując w nich plik docelowy (zasadniczo moja odpowiedź została zaimplementowana poprawnie), ale nie wydaje się, aby została zaimplementowana od razu po wyjęciu z pudełka. Oczywiście mogę się mylić.
Zero3,
Cóż, akceptuję to jako odpowiedź. Chociaż nie możemy udowodnić, że nie ma do tego interfejsu API Win32, miałem wrażenie, że MSI w jakiś sposób podłączyło się do procesu ładowania bez odpowiedniego publicznego interfejsu API.
wigy