Как узнать, к какому установочному пакету принадлежит данный exe / dll

11

Я хотел бы знать, что MSI установил данный DLL или EXE-файл в моей системе. Я знаю, что Windows исправляет удаленные файлы, если они принадлежат установленному пакету. Могу ли я запросить эту информацию, не удаляя файл? Есть ли инструмент или Win32 API, чтобы проверить, к какому пакету принадлежит файл?

wigy
источник

Ответы:

7

Похоже, что в конце концов может быть путь! Недавно я обнаружил записи реестра для файлов, установленных установщиками 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

ZERO3
источник
Ух ты. 2,5 года спустя ты прибил этот вопрос. Глядя на это поддерево, теперь я понимаю, почему для загрузки Windows требуется так много времени. Это должно быть проиндексировано в памяти, чтобы функция «Ваше приложение повреждено, вставьте диск» работала при каждом выполнении приложения.
парик
6

Если вы в порядке, просто найдя правдоподобные иглы в стоге сена, это быстрое и грязное злоупотребление 7-Zip сработает:

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

Затем откройте needlelist.txtв любом текстовом редакторе поиск, needlename.dllи вы найдете соответствующий пакет .msi в списках, созданных 7-Zip.

(Примечание: этот метод «грязный», потому что он просто сообщает вам, какие MSI-пакеты содержат файл с именем needlename.dll. Но, вероятно, он подходит для большинства случаев использования.)

ZERO3
источник
Действительно, это умное злоупотребление 7-Zip. Всегда ли установщик копирует MSI в эту папку C: \ Windows \ Installer или это просто соглашение, которое можно обойти? Я все еще жду элегантного Win32 API, прежде чем принять тот факт, что другого пути нет (и принять ваш ответ).
парик
Установщик AFAIK для Windows всегда кэширует установленные MSI-файлы в папке (также см. Superuser.com/questions/473569/… ). Причина этого логична: установщик также является деинсталлятором. Таким образом, Windows требуется копия деинсталлятора в известном месте, чтобы выполнить ее, когда пользователь хочет удалить приложение. Поскольку первоначальный MSI, вероятно, был удален много лет назад, Windows сохраняет копию во время установки.
Zero3
Что касается API: в отличие от большинства дистрибутивов Linux (и тому подобного), Windows (по крайней мере, до Windows 8) не имеет надлежащей системы управления пакетами, встроенной в операционную систему, способной запрашивать подобные вещи. Вероятно, можно создать приложение для этого, пройдя по всем установленным MSI-файлам и выполнив поиск в них целевого файла (по сути, мой ответ реализован правильно), но, похоже, это не реализовано «из коробки». Я могу ошибаться, конечно.
Zero3
Ну, я принимаю это как ответ. Хотя мы не можем доказать, что для этого нет Win32 API, у меня сложилось впечатление, что MSI каким-то образом подключился к загрузке процесса без надлежащего общедоступного API.
парик