我想知道哪个 MSI 在我的系统上安装了给定的 dll 或 exe。我知道如果已删除的文件属于已安装的软件包,Windows 会修复它们。我可以在不实际删除文件的情况下查询该信息吗?是否有工具或 Win32 API 可以检查文件属于哪个软件包?
答案1
看来还是有办法的!我最近在以下子树下发现了 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
如果你只是在大海捞针,那么这种快速而肮脏的滥用7-Zip将工作:
7z.exe l -an -air!C:\Windows\Installer\*.msi > needlelist.txt
然后在任何文本编辑器中打开needlelist.txt
,搜索needlename.dll
,您将在 7-Zip 生成的列表中找到相应的 .msi 包。
(注意:这种方法很“肮脏”,因为它只告诉您哪些 .msi 包包含名为 的文件needlename.dll
。但对于大多数用例来说,它可能没问题。)