2009-08-20 5 views
7

Ho un'applicazione che viene utilizzata su diverse centinaia di computer in tutta la società che devo modificare un file INI nella directory di installazione dell'applicazione. Gli utenti possono installare l'applicazione dove desiderano e possono avere più versioni dell'applicazione installata in un dato momento. Devo essere in grado di trovare la directory di installazione.Determina directory di installazione applicazioni di terze parti

metodi che ho considerato finora:

  • Utilizzando la WindowsInstaller per trovare il prodotto per nome e trovare la sua directory di installazione. (da here). - Questo ha funzionato quasi, ma le proprietà che mi aspetto di essere popolate (TARGETDIR, APPDIR) non lo sono.
  • Guardare attraverso il registro per trovare la directory di installazione per la particolare app. Non è lì dentro
  • MsiGetComponentPath()? L'ho visto nello stesso link sopra menzionato, ma non so come implementarlo. Posso ottenere l'ID prodotto utilizzando il programma di installazione di Windows, ma non so come fare a livello di programmazione, basta scegliere un componente e trovare il suo ID a caso. Chiunque?

Alright, consente di ascoltare qualsiasi altro metodo per determinare a livello di codice la directory di installazione di un'applicazione Windows.

risposta

7

Beh mi si avvicinò con una soluzione che ha funzionato per me:

 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 se qualcuno è chiedendosi quale DLL fare riferimento a 'Installer', è in C: \ windows \ system32 \ msi.dll. – Jedidja

+0

utilizzando WindowsInstaller; – RAM

1

Se l'installazione è un MSI quindi ottenere le informazioni da WMI è banale. La classe Win32_Product ha una proprietà InstallLocation per contenere queste informazioni.

2

Utilizzando WMI potrebbe funzionare per alcune persone, purtroppo i nostri utenti non avranno le credenziali che consentono loro di farlo sulle loro macchine:

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

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

Molto fresco che produce più soluzioni al problema! :) – Jedidja

+1

'Win32_Product' è Evil, non usarlo: http://sdmsoftware.com/wmi/why-win32_product-is-bad-news/ – Breeze

+0

@Hossein - Yikes, grazie per l'heads up – snicker