如何找出给定exe / dll属于哪个安装程序包


11

我想知道什么MSI在我的系统上安装了给定的dll或exe。我知道Windows可以修复已删除的文件(如果它们属于已安装的软件包)。我可以查询该信息而无需实际删除文件吗?是否有工具或Win32 API来检查文件所属的软件包?

Answers:


7

看来毕竟有办法!我最近在以下子树下发现了Windows Installers安装的文件的注册表项:

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拉链的快速而肮脏的滥用将起作用:

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

然后needlelist.txt在任何文本编辑器中打开,搜索,needlename.dll然后您将在7-Zip生成的清单中找到相应的.msi软件包。

(注意:此方法是“肮脏的”,因为它只告诉您哪个.msi软件包包含名为的文件needlename.dll。但是,对于大多数用例来说,它可能是好的。)


确实,这是对7-Zip的巧妙滥用。安装程序是否始终将MSI复制到该C:\ Windows \ Installer文件夹,还是只是可能被规避的约定?在接受没有其他方法(并接受您的回答)之前,我仍在等待优雅的Win32 API。
wigy

AFAIK Windows Installer始终将已安装的MSI缓存在该文件夹中(另请参见superuser.com/questions/473569/…)。这样做的原因是合乎逻辑的:安装程序也是卸载程序。因此,Windows需要在已知位置安装卸载程序的副本,以便在用户想要卸载应用程序时执行该卸载程序。由于此时可能已删除了原始MSI,因此Windows在安装过程中会保存一个副本。
Zero3

关于API:与大多数Linux发行版(及类似版本)不同,Windows(至少在Windows 8之前)没有在操作系统中内置适当的程序包管理系统,该系统无法查询类似内容。一个人可能可以通过运行所有已安装的MSI并在其中搜索目标文件(实际上是我的答案已正确实现)来创建一个应用程序,但这似乎不是开箱即用的。我当然是错的。
2013年

好吧,我接受它作为答案。尽管我们不能证明没有Win32 API,但是我的感觉是MSI在没有适当的公共API的情况下以某种方式陷入了进程加载。
wigy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.