2009-08-20 13 views
7

Ich habe eine Anwendung, die auf mehreren hundert Computern im gesamten Unternehmen verwendet wird, die ich eine INI-Datei im Installationsverzeichnis der Anwendung ändern muss. Benutzer können die Anwendung installieren, wo immer sie es wünschen, und können mehrere Versionen der Anwendung zu einem bestimmten Zeitpunkt installiert haben. Ich muss in der Lage sein, dieses Installationsverzeichnis zu finden.3rd Party Application Installationsverzeichnis ermitteln

Methoden Ich habe bisher in Betracht gezogen:

  • die Windows Unter Verwendung des Produktes nach dem Namen zu finden und seine Installationsverzeichnis zu finden. (von here). --Das hat fast funktioniert, aber die Eigenschaften, die ich erwartet hätte (TARGETDIR, APPDIR), sind nicht.
  • Suchen Sie in der Registrierung nach dem Installationsverzeichnis für die jeweilige App. Es ist nicht da drin.
  • MsiGetComponentPath()? Ich habe das in dem oben erwähnten Link gesehen, aber ich weiß nicht, wie ich es umsetzen soll. Ich kann die ProductID mit Windows Installer erhalten, aber ich weiß nicht, wie man programmatisch nur eine Komponente auswählt und ihre ID zufällig findet. Jemand?

In Ordnung, lassen Sie uns andere Methoden zum programmatischen Ermitteln des Installationsverzeichnisses einer Windows-Anwendung hören.

Antwort

7

Nun kam ich mit einer Lösung, die für mich gearbeitet:

 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 wenn jemand ist fragen, welche DLL für 'Installer' zu verweisen, ist es in C: \ windows \ system32 \ msi.dll. – Jedidja

+0

mit WindowsInstaller; – RAM

1

Wenn die Installation ein MSI ist, ist die Information von WMI trivial. Die Win32_Product-Klasse verfügt über eine InstallLocation-Eigenschaft, um diese Informationen zu speichern.

2

Mit WMI für einige Leute arbeiten konnten leider unsere Benutzer keine Anmeldeinformationen so dass sie diese auf ihren Maschinen tun:

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

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

Sehr cool, mehrere Lösungen für das Problem zu produzieren! :) – Jedidja

+1

'Win32_Product' ist böse, benutze es nicht: http://sdmsoftware.com/wmi/why-win32_product-is-bad-news/ – Breeze

+0

@Hossein - Yikes, danke für die Köpfe – snicker

Verwandte Themen