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