【问题标题】:Determine 3rd Party Application Installation Directory确定第 3 方应用程序安装目录
【发布时间】:2009-08-20 22:17:50
【问题描述】:

我有一个应用程序在公司的数百台计算机上使用,我必须修改应用程序安装目录中的 INI 文件。用户可以在任何地方安装应用程序,并且可以在任何给定时间安装应用程序的多个版本。我需要能够找到那个安装目录。

到目前为止我考虑过的方法:

  • 使用 WindowsInstaller 按名称查找产品并找到其安装目录。 (来自here)。 -- 这几乎可行,但我希望填充的属性(TARGETDIR、APPDIR)没有。
  • 通过注册表查找特定应用程序的安装目录。它不在里面。
  • MsiGetComponentPath()?我在上面提到的同一个链接中看到了这一点,但我不知道如何实现它。我可以使用 Windows 安装程序获取 ProductID,但我不知道如何以编程方式选择一个组件并随机找到它的 ID。有人吗?

好的,让我们听听任何其他以编程方式确定 Windows 应用程序安装目录的方法。

【问题讨论】:

    标签: c# installation windows-installer wmi


    【解决方案1】:

    我想出了一个适合我的解决方案:

            Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer");
            Installer msi = (Installer)Activator.CreateInstance(type);
            foreach (string productcode in msi.Products)
            {
                string productname = msi.get_ProductInfo(productcode, "InstalledProductName");
                if (productname.Contains("<APPLICATION NAME>"))
                {
                    string installdir = msi.get_ProductInfo(productcode, "InstallLocation");
                }
            }
    

    【讨论】:

    • 仅供参考,如果有人想知道为“安装程序”引用什么 DLL,它位于 C:\windows\system32\msi.dll 中。
    • 使用 WindowsInstaller;
    【解决方案2】:

    使用 WMI 可能适用于某些人,不幸的是我们的用户没有凭据允许他们在他们的计算机上执行此操作:

            ManagementObjectSearcher search = new ManagementObjectSearcher("Select InstallationLocation from Win32_Product");
            ManagementObjectCollection results = search.Get();
    
            foreach (ManagementObject mo in results)
            {
                Console.WriteLine(mo["InstallLocation"]);
            } 
    

    【讨论】:

    【解决方案3】:

    如果安装是 MSI,那么从 WMI 获取信息很简单。 Win32_Product 类有一个 InstallLocation 属性来保存此信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2012-09-01
      • 1970-01-01
      相关资源
      最近更新 更多