要安装/卸载/更新我们的软件,我们的自定义安装程序使用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/