2009-08-20 13 views
7

Tengo una aplicación que se usa en varios cientos de computadoras en toda la empresa y debo modificar un archivo INI en el directorio de instalación de la aplicación. Los usuarios pueden instalar la aplicación donde lo deseen y pueden tener múltiples versiones de la aplicación instaladas en cualquier momento. Necesito poder encontrar ese directorio de instalación.Determine el directorio de instalación de la aplicación de terceros

métodos que he considerado hasta ahora:

  • Utilizando el WindowsInstaller para encontrar el producto por su nombre y encontrar su directorio de instalación. (desde here). --Esto casi funcionó, pero las propiedades que esperaría que fueran pobladas (TARGETDIR, APPDIR) no lo son.
  • Revisando el registro para encontrar el directorio de instalación de la aplicación en particular. No está ahí.
  • MsiGetComponentPath()? Vi esto en el mismo enlace mencionado anteriormente, pero no sé cómo implementarlo. Puedo obtener el ProductID usando el instalador de Windows, pero no sé cómo seleccionar programáticamente un componente y encontrar su ID al azar. ¿Nadie?

Muy bien, escuchemos otros métodos para determinar mediante programación el directorio de instalación de una aplicación de Windows.

Respuesta

7

Bueno, yo le ocurrió una solución que funcionó para mí:

 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 si alguien está preguntándose a qué DLL hacer referencia para 'Installer', está en C: \ windows \ system32 \ msi.dll. – Jedidja

+0

usando WindowsInstaller; – RAM

1

Si la instalación es una MSI, obtener la información de WMI es trivial. La clase Win32_Product tiene una propiedad InstallLocation para contener esta información.

2

mediante WMI podría funcionar para algunas personas, lamentablemente nuestros usuarios no tendrán credenciales que les permite hacer esto en sus máquinas:

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

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

¡Muy bueno producir soluciones múltiples al problema! :) – Jedidja

+1

'Win32_Product' es Evil, no lo use: http://sdmsoftware.com/wmi/why-win32_product-is-bad-news/ – Breeze

+0

@Hossein - Gracias, por el aviso – snicker

Cuestiones relacionadas