2009-08-20 7 views
7

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

Методы Я считал до сих пор:

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

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

ответ

7

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

 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"); 
      } 
     } 
+5

FYI, если кто-то есть интересно, что DLL ссылается на «Installer», это в C: \ windows \ system32 \ msi.dll. – Jedidja

+0

с использованием WindowsInstaller; – RAM

1

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

2

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

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

     foreach (ManagementObject mo in results) 
     { 
      Console.WriteLine(mo["InstallLocation"]); 
     } 
+0

Очень классно создавать множество решений проблемы! :) – Jedidja

+1

'Win32_Product' является злым, не используйте его: http://sdmsoftware.com/wmi/why-win32_product-is-bad-news/ – Breeze

+0

@Hossein - Yikes, спасибо за головы – snicker

Смежные вопросы