Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在获取已安装产品的列表c#_C#_.net_Installation_Registry_Windows Installer - Fatal编程技术网

正在获取已安装产品的列表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的一种静态方法