获取已安装产品列表c#

时间:2013-06-24 11:12:17

标签: c# .net installer registry windows-installer

要安装/卸载/更新我们的软件,我们的自定义安装程序使用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工具会很困难,因为这是第三方工具,但这似乎有所帮助。

1 个答案:

答案 0 :(得分:2)

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

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

productCode(String)

     

产品实例的ProductCode(GUID)   列举。仅限上下文范围内的产品实例   将枚举userSid和context参数指定的内容。   此参数可以设置为null以枚举中的所有产品   指定的背景。

     

userSid(String)

     

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

     

context(UserContexts)

     

指定用户上下文。

包装Win32 MSI API MsiEnumProductsEx函数。这将带回一系列ProductInstallation,您可以对Linq进行查询,以找出有关已安装的MSI的任何信息。