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

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

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

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

最佳答案

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

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



  productCode(字符串)
  
  产品实例的ProductCode(GUID)
  枚举。仅上下文范围内的产品实例
  由userSid和context参数指定的值将被枚举。
  可以将此参数设置为null来枚举
  指定的上下文。
  
  userSid(字符串)
  
  指定安全标识符
  (SID),用于限制枚举的上下文。 SID值其他
  比s-1-1-0大的用户ID被认为是用户SID,并将枚举限制为
  当前用户或系统中的任何用户。特殊的SID字符串s-1-1-0
  (每个人)指定系统中所有用户的枚举。这个
  可以将参数设置为null以将枚举范围限制为
  当前用户。当上下文仅设置为机器上下文时,userSid
  必须为null。
  
  上下文(UserContext)
  
  指定用户上下文。


包装了Win32 MSI API MsiEnumProductsEx函数。这将带来一个ProductInstallation集合,您可以对它们进行Linq查询,以查找有关已安装的MSI所需了解的所有信息。

关于c# - 获取已安装产品的列表C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17274073/

10-17 01:17