获取已安装产品列表c#

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

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

你能建议任何可能的解决方法/解决方案吗?

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

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

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

productCode(String)

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

userSid(String)

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

上下文(UserContexts)

指定用户上下文。

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