2

为了安装/卸载/更新我们的软件,我们的自定义安装程序用于WindowsInstaller.Installer.Products从 Windows 注册表中获取已安装产品的列表。

在某些客户端计算机上,未知软件可能正在向注册表“ HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products ”添加一个新条目,该条目的名称类似于“ABCD”。这导致WindowsInstaller.Installer.Products抛出异常。我可以通过手动将注册表项添加到名为“test”的“ HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products ”中来重新创建此场景。如果我将 test 重命名为新的 GUID,那么模拟的问题就会得到解决。

您能提出任何可能的解决方法/解决方案吗?

使用 MSIINV.exe 工具会很困难,因为它是第 3 方工具,但这似乎有帮助。

4

1 回答 1

2

我会看一下 Windows Installer XML (WiX) 部署工具基础 (DTF) 中的 Microsoft.Deployment.WindowsInstaller 命名空间。它有:

public static IEnumerable<ProductInstallation> GetProducts(
    string productCode,
    string userSid,
    UserContexts context
)

产品代码(字符串)

要枚举的产品实例的 ProductCode (GUID)。只有在 userSid 和 context 参数指定的上下文范围内的产品实例才会被枚举。此参数可以设置为 null 以枚举指定上下文中的所有产品。

用户 ID(字符串)

指定限制枚举上下文的安全标识符 (SID)。s-1-1-0 以外的 SID 值被视为用户 SID,并将枚举限制为当前用户或系统中的任何用户。特殊的 SID 字符串 s-1-1-0 (Everyone) 指定系统中所有用户的枚举。该参数可以设置为 null 以将枚举范围限制为当前用户。当上下文仅设置为机器上下文时,userSid 必须为空。

上下文(用户上下文)

指定用户上下文。

包装了 Win32 MSI API MsiEnumProductsEx 函数。这会带回一个 ProductInstallation 集合,您可以对其进行 Linq 查询,以找出您需要了解的有关已安装 MSI 的任何信息。

于 2013-06-24T14:24:21.093 回答