正在获取已安装产品的列表c#
要安装/卸载/更新我们的软件,我们的自定义安装程序使用正在获取已安装产品的列表c#,c#,.net,installation,registry,windows-installer,C#,.net,Installation,Registry,Windows Installer,要安装/卸载/更新我们的软件,我们的自定义安装程序使用WindowsInstaller.installer.Products从windows注册表获取已安装产品的列表 在某些客户端计算机上,未知软件可能正在向注册表“HKEY\U LOCAL\U MACHINE\software\Classes\Installer\Products”中添加一个新条目,该注册表项的名称类似于“ABCD”。这导致WindowsInstaller.Installer.Products引发异常。我可以通过手动将注册表项条
WindowsInstaller.installer.Products
从windows注册表获取已安装产品的列表
在某些客户端计算机上,未知软件可能正在向注册表“HKEY\U LOCAL\U MACHINE\software\Classes\Installer\Products”中添加一个新条目,该注册表项的名称类似于“ABCD”。这导致WindowsInstaller.Installer.Products
引发异常。我可以通过手动将注册表项条目添加到名为“测试”的“HKEY\U LOCAL\U MACHINE\SOFTWARE\Classes\Installer\Products”中来重新创建此方案。如果我将测试重命名为一个新的GUID,那么模拟的问题就会得到解决
您能提出任何可能的解决方法/解决方案吗
使用MsiVIN.EXE工具将是困难的,因为这是一个第三方工具,但这似乎有帮助。 < P>我将查看Windows安装程序XML(WIX)部署工具基金会(DTF)中发现的MySoFalth.AdvestMy.WINDOWSINSTALLER命名空间。它有:
public static IEnumerable<ProductInstallation> GetProducts(
string productCode,
string userSid,
UserContexts context
)
公共静态IEnumerable GetProducts(
字符串productCode,
字符串userSid,
用户上下文
)
产品代码(字符串)
要创建的产品实例的ProductCode(GUID)
列举。仅上下文范围内的产品实例
将枚举userSid指定的上下文参数。
此参数可以设置为null,以枚举
指定的上下文
userSid(字符串)
指定安全标识符
(SID)限制枚举的上下文。另一个SID值
s-1-1-0被视为用户SID,并将枚举限制为
当前用户或系统中的任何用户。特殊SID字符串s-1-1-0
(Everyone)指定系统中所有用户的枚举。这
参数可以设置为null,以将枚举范围限制为
当前用户。当上下文仅设置为计算机上下文时,userSid
必须为空
上下文(用户上下文)
指定用户上下文
包装Win32 MSI API MsiEnumProductsEx函数的。这将带回一个ProductInstallation集合,您可以对其执行Linq查询,以了解有关已安装MSI的任何信息。请查看WiX DTF中的MSI互操作库(如下所示)。这比尝试将COM互操作与WindowsInstaller.Installer一起使用更简单、更干净。感谢您的回复。我知道WIX DTF现在是一个开源项目,尽管它是由微软发起的。对于Microsoft提供的程序集,我能做的不是很多吗?我不是一个讨厌开源的人,但要把这样的东西放在这里是很困难的!作为替代,我尝试使用ProductEx属性,如下所示<代码>Interop.WindowsInstaller.Installer.ProductEx[“”,“”,7]。但我无法理解如何使用返回的记录列表。尽管有上面提到的“坏”注册表值,这仍然有效。你能告诉我如何在c#应用程序中使用返回的记录列表吗?Windows Installer出自Windows平台,只支持Win32和COM。还有通过Win32_产品类对WMI的支持,但坦率地说,WMI支持严重受损,COM支持在我上次检查时出现了生成互操作的问题。在.NET Framework基类库中不支持MSI。抱歉,我不打算使用我知道不是最佳的方法来帮助您。如果我自己不做,我就不会教别人做。为了给别人节省一些工作,这是Microsoft.Deployment.WindowsInstaller.ProductInstallation的一种静态方法