【问题标题】:Find / Predict *.msi file installation location reading *.msi database查找/预测 *.msi 文件安装位置读取 *.msi 数据库
【发布时间】:2016-04-26 12:19:16
【问题描述】:

每当我们安装软件时,Windows 操作系统都会在 C:\Windows\Installer\ 位置保留安装程序 *.msi 的备份副本。

所以我正在遍历“C:\Windows\Installer\”中存在的所有 msi 文件

我想准备一个映射列表,其中列表将包含 *.msi 文件及其默认位置。

假设 C:\Windows\Installer[一些产品密钥]\123xR23.msi 考虑“123xR23.msi”是 WinZip 安装的备份文件。并且安装程序已将 WinZip 安装在位置“C:\Program Files(x86)\WinZip”

所以列表将有以下条目 "123xR23.msi","C:\Program Files(x86)\WinZip"

请帮帮我。

谢谢

【问题讨论】:

  • 您可以找到备份 .msi 但找不到已安装或未安装的文件...例如备份 msi 文件名 ABC.msi 但安装程序将其安装为 XYZ.msi 因为用户也更改了路径安装目录以及exe名称...所以不可能找到完美的位置
  • 嗨,Pranav 对,我们无法知道用户在安装时给出的确切路径。所以我只是想知道如果用户没有更改默认值的预测。
  • 如果你想预测然后使用安装程序名称并在程序文件文件夹中找到并尝试匹配
  • 感谢您的回复。位置“C:\Windows\Installer”具有随机名称的 msi。即使在使用实用程序 Orca.exe 阅读 *.msi 之后,它也是模棱两可的。拿 3 到 5 个 *.msi 试试看。在某些情况下,您会使用查询“SELECT Target FROM CustomAction WHERE Action = 'DIRCA_TARGETDIR'”从 msi 数据库的“CustomActions”表中找到路径。

标签: c# wix orca


【解决方案1】:

首先,你为什么需要这个?

这些 *.msi 文件的映射已经存在于注册表中 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\\Products\\InstallerProperties 然后 msi 的值在 LocalPackage 下

S-1-5-18 是本地系统的安全 ID。

ProductGUID 在这里也有点奇怪。在您的安装程序中,您会看到类似

2F7DBBE6-8EBC-495C-9041-46A772F4E311

但注册表路径中的产品 G​​UID 将如下所示

6EBBD7F2CBE8C5940914647A274F3E11

这肯定是有原因的,但我不知道是什么原因。在注册表中查看时,您只需将您的产品 guid 转换为其他表示形式。

还有一个名为 InstallLocation 的注册表项,其中应包含 msi 包的安装位置。不过,这并不总是填写。也许安装目录存储在注册表中的其他位置,我不知道您可能需要四处看看。


编辑:看起来安装的每个组件都会在注册表中通过 GUID 获得一个条目,其中包含它安装到的路径。如果上面提到的 InstallLocation 下未列出特定 MSI,这可以帮助您找到它的安装位置。根据 Micheal 的评论,我建议利用 Msi 相关功能 (https://msdn.microsoft.com/en-us/library/windows/desktop/aa372420(v=vs.85).aspx)

【讨论】:

  • 你是对的。我有来自注册表的软件和卸载程序位置/卸载程序路径列表。如果假设用户使用默认设置安装它,我想预测安装了哪些软件。例如,WinZip 软件安装的可能位置将是“C:\Program File\WinZip”或“C:\Program File(86)\WinZip” 我想列出所有软件及其可能的安装路径 .msi。 (为此,我们可以使用 Orca 查询或读取 *.msi。)我无法从那里预测它。
  • 既然有非常好的方法可以使用 C++ 进行此枚举(请参阅 MsiEnumProducts/Ex 和 MsiGetProductInfo)或C#,为什么还要压缩 GUID 并浏览注册表?
  • @Micheal 因为我不知道这些方法存在 =] 有一些 windows api 来发现这些东西是有道理的。如果您认为这是解决此问题的最佳方法,请考虑编写答案。
  • @Micheal 你的代码看起来不错。但不知何故,在一台机器上安装的 103 个产品中,我只得到了 47 个与路径映射的产品。您能否建议我们如何找到剩余的 66 个产品路径。
  • 从注册表读取的原因是某些产品安装程序是作为 EXE 提供的,因此使用 windows API 无法读取它们的信息,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多