Определите сторонний каталог установки приложений - PullRequest
7 голосов
/ 21 августа 2009

У меня есть приложение, которое используется на нескольких сотнях компьютеров в компании, и я должен изменить INI-файл в каталоге установки приложения. Пользователи могут устанавливать приложение там, где они пожелают, и могут иметь несколько версий приложения, установленных в любой момент времени. Мне нужно найти каталог для установки.

Методы, которые я рассмотрел до сих пор:

  • Использование WindowsInstaller, чтобы найти продукт по названию и найти его установочный каталог. (с здесь ). - Это почти сработало, но свойства, которые я ожидаю заполнить (TARGETDIR, APPDIR) - нет.
  • Просматривая реестр, чтобы найти каталог установки для конкретного приложения. Его там нет.
  • MsiGetComponentPath ()? Я видел это по той же ссылке, упомянутой выше, но я не знаю, как это реализовать. Я могу получить ProductID с помощью установщика Windows, но я не знаю, как программно просто выбрать компонент и найти его идентификатор в произвольном порядке. Кто-нибудь?

Хорошо, давайте послушаем любые другие методы программного определения каталога установки приложения Windows.

Ответы [ 3 ]

7 голосов
/ 21 августа 2009

Ну, я придумала решение, которое работает для меня:

        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");
            }
        }
2 голосов
/ 21 августа 2009

Использование WMI может работать для некоторых людей, к сожалению, у наших пользователей не будет учетных данных, позволяющих им делать это на своих машинах:

        ManagementObjectSearcher search = new ManagementObjectSearcher("Select InstallationLocation from Win32_Product");
        ManagementObjectCollection results = search.Get();

        foreach (ManagementObject mo in results)
        {
            Console.WriteLine(mo["InstallLocation"]);
        } 
1 голос
/ 21 августа 2009

Если установка MSI, получение информации из WMI тривиально. Класс Win32_Product имеет свойство InstallLocation для хранения этой информации.

...