2010-08-13 17 views
8

He instalado algunos MSI con GUID (0733556C-37E8-4123-A801-D3E6C5151617). El programa inscrito en el registro: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \()¿Cómo encontrar la ubicación del programa en el registro si conozco el GUID de MSI?

Valor UninstallString = MsiExec.exe/I (0733556C-37E8-4123-A801-D3E6C5151617)

Mi pregunta es: ¿cómo la utilidad MsiExec.exe conoce el nombre y la ruta del archivo que desea ejecutar cuando elimina los programas? ¿En qué parte del registro se puede encontrar esta información?

+0

Ya son respuestas muy buenas, pero ** la forma más fácil ** de obtener información sobre su producto instalado es probablemente [** utilizando un simple comando de PowerShell **] (https://stackoverflow.com/questions/29937568/how) -can-i-find-the-product-guid-of-an-installed-msi-setup/29937569 # 29937569) –

+0

Leyendo esto de nuevo Creo que leí mal su pregunta.Supongo que la respuesta real a su pregunta es que toda la información sobre los productos instalados se almacena en el registro en '' HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer''. Esta es ** la base de datos de Windows Installer ** y nunca debe tocar ningún valor aquí directamente. En su lugar, puede acceder a ellos a través de [API Win32 llamadas (C++)] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa369426 (v = vs.85) .aspx) o puede utilizar [Automatización COM] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa367810 (v = vs.85) .aspx) (más fácil). –

Respuesta

12

Windows mantiene la información de configuración de Windows Installer oculta y encriptada en el Registro. No es navegable con el ojo humano como lo son otras partes del Registro.

Para consultar/modificar/eliminar esta información, deberá usar las funciones de MSI.
(Installer Function Reference)

Para su pregunta en particular, intente con la función MsiGetProductInfo.

+2

Oculto y encriptado, ¿en serio? – Rup

+1

Consulte [Tao del instalador de Windows, Parte 2] (http://blogs.msdn.com/b/windows_installer_team/archive/2006/05/12/595950.aspx) del [Blog del equipo de Windows Installer] (http: //blogs.msdn.com/b/windows_installer_team/). Ver la Regla 21: Evite el uso de datos de configuración que no le pertenecen. Dice: "Esta información es administrada por el instalador y no se recomienda el acceso directo de usuarios o aplicaciones, de hecho, algunos de los datos están codificados para que sea muy difícil manipularlos manualmente". –

0

Esa clave se asigna a HKEY_CLASSES_ROOT\Installer\Products\.

+0

HKEY_CLASSES_ROOT \ Installer \ Products \ no incluye la ruta al programa instalado. ¿Dónde puedo encontrarlo? – Yuriy

+1

No necesita la ruta de acceso a la aplicación que se instaló, ¿y si instaló 10 aplicaciones ?, todo lo que necesita es la ruta al desinstalador (o módulo .msi). Eche un vistazo @ a la salida de la "lista de productos wmic" en la línea de comando. –

+0

En realidad, necesito determinar la ubicación de la aplicación (unidad de disco) para estimar el espacio disponible en disco antes de instalar el parche msp. ¿Puedo determinar la ubicación de la aplicación instalada si solo sé guid en HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \ {}? – Yuriy

7

Usted podría intentar, desde la línea de comandos:

wmic product where "Name like '%your software here%'" get Name, Version, PackageCode 
+3

¡Guau! pero mi cmq dice que es una consulta inválida ... – BlackBear

1

hay una utilidad libre de Tarma Investigación de Software que he encontrado útiles para esto. Consíguelo desde their website.

7

Aquí hay un programa sencillo de C# que usa MsiGetProductInfo, como dice William Leara, para obtener la ubicación real del instalador en caché en el disco.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Int32 len = 512; 
     System.Text.StringBuilder builder = new System.Text.StringBuilder(len); 
     MsiGetProductInfo("{89C098E5-C108-49F9-9B1D-10503C6D8A05}", "LocalPackage", builder, ref len); 
     Console.WriteLine(builder.ToString()); 
     Console.ReadLine(); 
    } 

    [DllImport("msi.dll", CharSet = CharSet.Unicode)] 
    static extern Int32 MsiGetProductInfo(string product, string property, [Out] StringBuilder valueBuf, ref Int32 len); 
} 
1

No necesita ningún software. Esto funciona en Windows 10 y creo que también es válido para Windows 7.

Si su Código de producto es 0733556C-37E8-4123-A801-D3E6C5151617. Intente encontrar la clave C65533708E7332148A103D6E5C516171 (básicamente se invierte) una vez que la encontró, busque la subclave InstallProperties, si no existe, intente encontrar otro resultado. Una vez que haya encontrado InstallProperties, abra y encuentre la clave LocalPackage. Y luego tiene la ruta para el paquete MSI que MSI guarda como Caché cuando instaló su aplicación.

1

La premisa de esta pregunta es engañosa porque DesinstalarString en el registro no se utiliza al realizar la desinstalación. Continúa y cambia la cadena para probar esto; no usará tu cadena modificada.

Aunque las referencias a cosas en el registro pueden ser atractivas, la respuesta corta es que los datos de Windows Installer en el registro son detalles de implementación. La pregunta es, básicamente, preguntar cómo funciona MsiConfigureProduct (.... INSTALLSTATE_ABSENT ...), y no tiene sentido adivinar los detalles de la implementación y dónde podría estar en el registro. Son API todo el camino hacia abajo. Puede haber una tarea real que el póster haya querido realizar, pero está enmascarada por la cuestión de cómo funcionan las desinstalaciones.

+0

Definitivamente de acuerdo: nunca es aceptable acceder directamente a los datos de la base de datos de MSI, o incluso simplemente tratar de decodificarlo, lo que mucha gente parece estar haciendo con cosas que encuentran en el registro. –

Cuestiones relacionadas