Як дізнатися, до якого пакета інсталятора належить даний exe / dll


11

Я хотів би знати, що MSI встановив заданий dll або exe в моїй системі. Я знаю, що Windows виправляє видалені файли, якщо вони належать до встановленого пакету. Чи можна запитати цю інформацію, не фактично видаляючи файл? Чи є інструмент чи API Win32, щоб перевірити, до якого пакету належить файл?

Відповіді:


6

Здається, що може бути спосіб все-таки! Нещодавно я виявив записи реєстру для файлів, встановлених Інсталяторами Windows під таким піддеревом:

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

Я написав невеликий скрипт Python, щоб знайти інсталятор файлу, використовуючи інформацію, що зберігається там:

> 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

Він доступний тут: https://github.com/Zero3/windows-installer-file-search


Ого. Через 2,5 роки ви поставили це питання. Дивлячись на це піддерево, тепер я розумію, чому для завантаження Windows потрібно так багато часу. Це потрібно індексувати в пам'яті, оскільки функція "ваша програма пошкоджена, вставити диск", щоб працювати над кожним виконанням програми.
wigy

6

Якщо вам все добре, що просто знайдете правдоподібні голки в копиці сіна, це швидке і брудне зловживання 7-Zip :

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

Потім відкрийте needlelist.txtбудь-який текстовий редактор, знайдіть needlename.dllі ви знайдете відповідний пакет .msi у списках, створених 7-Zip.

(Примітка. Цей метод "брудний", оскільки він просто повідомляє, які .msi пакети містять файл з ім'ям needlename.dll. Але це, мабуть, добре для більшості випадків використання.)


Дійсно, це хитро зловживання 7-Zip. Чи завжди інсталятор копіює MSI в цю папку C: \ Windows \ Installer чи це просто умова, яку можна обійти? Я все ще чекаю елегантного API Win32, перш ніж приймати факт, що іншого шляху немає (і приймаю вашу відповідь).
wigy

AFAIK Windows Installer завжди кешує встановлені MSI в папці (також див. Superuser.com/questions/473569/… ). Причина цього логічна: інсталятором є також видалення. Таким чином, Windows потребує копії видалення у відомому місці, щоб виконати її, коли користувач хоче видалити додаток. Оскільки початковий MSI, ймовірно, був видалений століттями тому в цей момент, Windows зберігає копію під час встановлення.
Zero3

Щодо API: На відміну від більшості дистрибутивів Linux (тощо), Windows (як мінімум до Windows 8) не має належної системи управління пакунками, вбудованої в операційну систему, здатної запитувати такі речі. Можливо, можна було б створити додаток для цього, запустивши через всі встановлені MSI та шукати всередині них цільовий файл (фактично моя відповідь реалізована належним чином), але це, здається, не реалізоване поза коробкою. Я, можливо, помиляюся.
Zero3

Ну, я приймаю це як відповідь. Хоча ми не можемо довести, що для цього немає API Win32, я відчував, що MSI якось підключився до завантаження процесу без належного публічного API.
wigy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.