¿Cómo puedo encontrar el GUID del producto de una instalación de MSI instalada?

Necesito encontrar el GUID del producto para un archivo MSI instalado con el fin de realizar el mantenimiento, como parcheo, desinstalación y también para propósitos de auditoría.

Version corta

La información a continuación ha crecido considerablemente con el tiempo y puede haberse vuelto demasiado elaborada. ¿Cómo obtener códigos de productos rápidamente? (cuatro enfoques):

1. Usa el Powershell “one-liner”

Desplácese hacia abajo para la captura de pantalla y paso a paso . Descargo de responsabilidad también a continuación: riesgos menores o moderados dependiendo de a quién le pregunte. Funciona bien para mi Cualquier reparación automática desencadenada por esta opción generalmente debería ser posible cancelar. Las comprobaciones de integridad del paquete activadas sí agregan algún “ruido” de registro de eventos. ¡ Nota ! IdentifyingNumber es el ProductCode (peculiaridad de WMI).

 get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize 

Inicio rápido de Powershell : mantenga presionada la tecla Windows , toque R , escriba “powershell” y presione Entrar

2. Utilice VBScript

Descrito abajo en ” Herramientas alternativas” (sección 3) . Esta opción puede ser más segura que Powershell por los motivos explicados en detalle a continuación. En esencia, es (mucho) más rápido y no es capaz de desencadenar la autorreparación de MSI, ya que no pasa por WMI (accede directamente a la API COM de MSI , a una velocidad vertiginosa). Sin embargo, es más complicado que la opción Powershell (varias líneas de código).

3. Búsqueda de registro

Algunos juran al buscar cosas en el registro. No es mi enfoque recomendado: me gusta pasar por las API adecuadas (o en otras palabras: llamadas a la función del sistema operativo). Siempre hay excepciones raras explicadas solo por las partes internas de la implementación API:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
  • HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall

4. Original MSI File / WiX Source

Puede encontrar el Product Code en la Property table de Property table de cualquier archivo MSI (y cualquier otra propiedad). Sin embargo, el GUID podría ser anulado (raramente) por una transformación aplicada en el momento de la instalación y no coincidir con el GUID en el que está registrado el producto (los enfoques 1 y 2 anteriores informarán el código real del producto, que está registrado con Windows) en tal escenarios raros).

Necesitas una herramienta para ver los archivos MSI . Consulte hacia la parte inferior de la siguiente respuesta una lista de herramientas gratuitas que puede descargar (o consulte la opción rápida a continuación): ¿Cómo puedo comparar el contenido de dos (o más) archivos MSI?

ACTUALIZACIÓN : por conveniencia y necesidad de velocidad :-), descargue SuperOrca sin demora y sin problemas desde este enlace directo de descarga directa – la herramienta es lo suficientemente buena para hacer el trabajo – instale, abra MSI e ir directamente a la tabla de propiedades y encuentre el Fila de ProductCode ( por favor, siempre compruebe el virus de un ProductCode directo de descarga directa; obviamente , puede usar virustotal.com para hacerlo), escaneo en línea utilizando decenas de suites antivirus y malware para escanear lo que carga).


Y a continuación encontrará la respuesta original que “creció orgánicamente” en muchos detalles.

Tal vez consulte la sección ” Desinstalar paquetes MSI ” a continuación si esta es la tarea que necesita realizar.


Recuperar códigos de producto

ACTUALIZACIÓN : si también necesita el código de actualización , verifique esta respuesta: ¿Cómo puedo encontrar el Código de actualización para un archivo MSI instalado? (recupera códigos de productos asociados, códigos de actualización y nombres de productos en una salida de tabla, similar a la siguiente).

  • No se puede usar PowerShell? Vea la sección “Herramientas alternativas” a continuación.
  • ¿Quieres desinstalar? Consulte la sección “Desinstalar paquetes MSI” a continuación.

Encienda Powershell ( mantenga presionada la tecla Windows, toque R, suelte la tecla Windows, escriba “powershell” y presione OK ) y ejecute el comando siguiente para obtener una lista de códigos de productos del paquete MSI instalados junto con la ruta del paquete de caché local y el nombre del producto (maximice la ventana de PowerShell para evitar nombres truncados).

Antes de ejecutar esta línea de comando, lea el descargo de responsabilidad a continuación (nada peligroso, solo algunas molestias potenciales). La Sección 3 en “Herramientas alternativas” muestra una forma alternativa que no es WMI para obtener la misma información usando VBScript. Si está intentando desinstalar un paquete, hay una sección a continuación con algunas líneas de comando de ejemplo de msiexec.exe:

 get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize 

El resultado debería ser similar a esto:

enter image description here

¡Nota! Por alguna extraña razón, el “Código de producto” se denomina “Número de identificación” en WMI. En otras palabras, en la imagen de arriba, el Número identificador es el Código del producto.

Si necesita ejecutar esta consulta de forma remota contra una gran cantidad de equipos remotos , consulte la sección ” Recuperar códigos de productos de una computadora remota ” a continuación.

DESCARGO DE RESPONSABILIDAD (¡Importante, lea antes de ejecutar el comando!): Debido al extraño diseño de Microsoft, cualquier llamada de WMI a Win32_Product (como el comando de PowerShell a continuación) activará una validación del estado del paquete . Además de ser bastante lento , en raras ocasiones puede desencadenar una auto reparación de MSI. Puede ser un paquete pequeño o algo enorme, como Visual Studio. En la mayoría de los casos esto no sucede, pero existe un riesgo. No ejecute este comando justo antes de una reunión importante; nunca es peligroso (es de solo lectura), pero puede llevar a una reparación prolongada en casos muy raros (creo que también puede cancelar la auto reparación). a menos que el paquete en cuestión lo prevenga activamente, pero se reiniciará si vuelve a llamar a Win32_Product y esto persistirá hasta que termine la reparación automática; a veces puede continuar incluso si deja que termine: ¿cómo puedo determinar qué causa la repetición? ¿Auto reparación de Windows Installer? ).

Y solo para que quede constancia: algunas personas informan que sus registros de eventos se llenan con entradas de MsiInstaller EventID 1035 (vea la respuesta del jefe de código), aparentemente causadas por consultas de WMI a la clase Win32_Product (personalmente nunca he visto esto). Esto no está directamente relacionado con el comando Powershell sugerido anteriormente, sino que está en contexto de uso general de la clase WIM Win32_Product.

También puede obtener el resultado en forma de lista (en lugar de tabla):

 get-wmiobject -class Win32_Product 

En este caso, el resultado es similar a esto:

enter image description here


Recuperar códigos de producto de una computadora remota

En teoría, solo debería poder especificar un nombre de computadora remoto como parte del comando mismo. Aquí está el mismo comando que se configuró anteriormente para ejecutarse en la máquina “RemoteMachine” (se -ComputerName RemoteMachine sección de máquina remota de -ComputerName RemoteMachine ):

 get-wmiobject Win32_Product -ComputerName RemoteMachine | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize 

Esto podría funcionar si está ejecutando derechos de administrador de dominio en un dominio adecuado. En un entorno de grupo de trabajo (pequeña oficina / red doméstica), probablemente tenga que agregar credenciales de usuario directamente a las llamadas WMI para que funcione.

Además, las conexiones remotas en WMI se ven afectadas por (al menos) Firewall de Windows , configuración DCOM y Control de cuentas de usuario (UAC) (además de factores adicionales que no son de Microsoft, como firewalls reales , firewalls de software de terceros , software de seguridad de varios tipos , etc …). Si funcionará o no dependerá de su configuración exacta.

  • Configuración de una conexión WMI remota
  • Conexión a WMI de forma remota con PowerShell

ACTUALIZACIÓN : en esta respuesta se puede encontrar una extensa sección sobre la ejecución WMI remota: ¿Cómo puedo encontrar el Código de actualización para un archivo MSI instalado? . Parece que una regla de firewall y la supresión de la solicitud de UAC a través de un ajuste de registro pueden hacer que las cosas funcionen en un entorno de red de grupo de trabajo. No se recomiendan cambios de seguridad, pero funcionó para mí.


Herramientas alternativas

PowerShell requiere que se instale .NET Framework (actualmente en la versión 3.5.1 parece? Octubre de 2017). La aplicación real de PowerShell también puede faltar en la máquina incluso si está instalado .NET. Finalmente, creo que PowerShell puede ser deshabilitado o bloqueado por varias políticas y privilegios del sistema.

Si este es el caso, puede probar algunas otras maneras de recuperar los códigos de productos. Mi alternativa preferida es VBScript : es rápida y flexible (pero también se puede bloquear en ciertas máquinas, y la creación de scripts siempre es un poco más complicada que usar herramientas).

  1. Comencemos con una herramienta wbemtest.exe WMI de Windows : wbemtest.exe .

    • Inicie wbemtest.exe ( Mantenga presionada la tecla de Windows, toque R, suelte la tecla de Windows, escriba “wbemtest.exe” y presione OK ).
    • Haga clic en conectarse y luego en Aceptar (el espacio de nombres se predetermina en root \ cimv2) y haga clic en ” conectar ” nuevamente.
    • Haga clic en ” Consultar ” y escriba este comando WQL (sabor SQL): SELECT IdentifyingNumber,Name,Version FROM Win32_Product y haga clic en “Usar” (o equivalente – la herramienta estará localizada).
    • Captura de pantalla de salida de muestra (truncada). No es el mejor formato, pero puede obtener la información que necesita. IdentifyingNumber es el código del producto MSI :

wbemtest.exe

  1. A continuación, puede probar una herramienta WMI personalizada más completa, como WMIExplorer.exe

    • Esto no está incluido en Windows. Sin embargo, es una herramienta muy buena. Recomendado.
    • Compruébelo en: https://github.com/vinaypamnani/wmie2/releases
    • Inicie la herramienta, haga clic en Conectar, haga doble clic en ROOT \ CIMV2
    • Desde la pestañaConsulta “, ingrese la siguiente consulta SELECT IdentifyingNumber,Name,Version FROM Win32_Product y presione Ejecutar.
    • Captura de pantalla omitida, la aplicación requiere demasiada pantalla de bienes inmuebles.
  2. Finalmente, puede probar un VBScript para acceder a la información a través de la interfaz de automatización MSI (función principal de Windows, no está relacionada con WMI ).

    • Copie la secuencia de comandos siguiente y péguelo en un archivo * .vbs en su escritorio, e intente ejecutarlo haciendo doble clic. Su escritorio debe ser de escritura para usted o puede usar cualquier otra ubicación de escritura.
    • Este no es un gran VBScript. La tergiversación ha sido preferible a la gestión de errores y la integridad, pero debe hacer el trabajo con la mínima complejidad.
    • El archivo de salida se crea en la carpeta desde donde ejecuta el script (la carpeta debe poder escribirse ). El archivo de salida se llama msiinfo.csv .
    • Haga doble clic en el archivo para abrir en una aplicación de hoja de cálculo, seleccione la coma como delimitador en la importación O BIEN, abra el archivo en el Bloc de notas o en cualquier visualizador de texto.
    • Abrir en una hoja de cálculo permitirá funciones avanzadas de clasificación.
    • Este script se puede adaptar fácilmente para mostrar una cantidad significativa de detalles adicionales sobre la instalación de MSI . Una demostración de esto se puede encontrar aquí: cómo saber qué productos están instalados, productos más nuevos ya están instalados . Ventanas MSI .
 ' Retrieve all ProductCodes (with ProductName and ProductVersion) Set fso = CreateObject("Scripting.FileSystemObject") Set output = fso.CreateTextFile("msiinfo.csv", True, True) Set installer = CreateObject("WindowsInstaller.Installer") On Error Resume Next ' we ignore all errors For Each product In installer.ProductsEx("", "", 7) productcode = product.ProductCode name = product.InstallProperty("ProductName") version=product.InstallProperty("VersionString") output.writeline (productcode & ", " & name & ", " & version) Next output.Close 

No puedo pensar en ninguna otra opción de propósito general para recuperar códigos de productos en este momento, por favor agregue si conoce alguno. Solo edite en línea en lugar de agregar demasiados comentarios, por favor.

Puede acceder a esta información desde su aplicación llamando a la interfaz de automatización de MSI (basada en COM) O a las funciones de instalador de C ++ MSI (API de Win32). O incluso use consultas de WMI desde su aplicación como lo hace en los ejemplos anteriores utilizando PowerShell , wbemtest.exe o WMIExplorer.exe .


Desinstalar paquetes de MSI

Si lo que quiere hacer es desinstalar el paquete MSI para el que encontró el código del producto, puede hacerlo de la siguiente manera usando un símbolo del sistema elevado (busque cmd.exe , haga clic con el botón derecho y ejecute como administrador ):

Opción 1 : Desinstalación básica e interactiva sin registro (rápida y fácil):

 msiexec.exe /x {00000000-0000-0000-0000-00000000000C} 

Explicación rápida del parámetro:

 /X = run uninstall sequence {00000000-0000-0000-0000-00000000000C} = product code for product to uninstall 

También puede habilitar el registro (detallado) y ejecutarlo en modo silencioso si lo desea, lo que nos lleva a la opción 2:

Opción 2 : desinstalación silenciosa con registro detallado (mejor para archivos por lotes):

 msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress 

Explicación rápida del parámetro:

 /X = run uninstall sequence {00000000-0000-0000-0000-00000000000C} = product code for product to uninstall /QN = run completely silently /L*V "C:\My.log"= verbose logging at specified path REBOOT=ReallySuppress = avoid unexpected, sudden reboot 

Aquí hay una referencia completa para la desinstalación de MSI (varias maneras diferentes de desinstalar paquetes MSI): Desinstalar un archivo MSI de la línea de comandos sin usar msiexec . Hay una plétora de diferentes formas de desinstalar.

Si está escribiendo un archivo por lotes, consulte la sección 3 en la respuesta vinculada anterior para ver algunas variantes comunes y estándar de la línea de comandos de desinstalación.

Y un enlace rápido a msiexec.exe (opciones de línea de comando) (descripción general de la línea de comando para msiexec.exe de MSDN). Y la versión de Technet también.


Recuperando otras propiedades / información de MSI (Código de actualización de f.ex)

ACTUALIZACIÓN : encuentre una nueva respuesta sobre cómo encontrar el código de actualización para los paquetes instalados en lugar de buscar manualmente el código en los archivos MSI. Para los paquetes instalados, esto es mucho más confiable. Si el paquete no está instalado, igual debe buscar en el archivo MSI (o en el archivo fuente utilizado para comstackr el MSI) para encontrar el código de actualización. Saliendo en la sección anterior a continuación:

Si desea obtener UpgradeCode u otras propiedades MSI , puede abrir MSI de instalación en caché para el producto desde la ubicación especificada por ” LocalPackage ” en la imagen mostrada arriba (algo así como: C:\WINDOWS\Installer\50c080ae.msi – es un nombre de archivo hexadecimal, único en cada sistema). Luego, busca en la ” Tabla de propiedades ” el Código de actualización (es posible que el Código de actualización se redefina en una transformación, para asegurarse de que obtiene el valor correcto que necesita para recuperar el código programáticamente del sistema), proporcionaré un script para esto en breve. Sin embargo, el UpgradeCode encontrado en el MSI almacenado en caché generalmente es correcto ).

Para abrir los archivos MSI en caché, use Orca u otra herramienta de empaquetado. Aquí hay una discusión de diferentes herramientas (cualquiera de ellas lo hará): ¿Qué producto de instalación usar? InstallShield, WiX, Wise, instalador avanzado, etc. Si no tiene instalada una herramienta de este tipo, su apuesta más rápida podría ser probar Super Orca (es fácil de usar, pero no probé exhaustivamente).

ACTUALIZACIÓN : aquí hay una nueva respuesta con información sobre varios productos gratuitos que puede usar para ver archivos MSI: ¿Cómo puedo comparar el contenido de dos (o más) archivos MSI?

Si tiene instalado Visual Studio , intente buscar Orca-x86_en-us.msi – en Program Files (x86) – e instálelo (este es el propio visor y editor oficial de MSI de Microsoft). Luego encuentra Orca en el menú de inicio. Ve el tiempo en poco tiempo :-). Técnicamente, Orca se instala como parte de Windows SDK (no de Visual Studio), pero Windows SDK se incluye con la instalación de Visual Studio. Si no tiene instalado Visual Studio , ¿tal vez conozca a alguien que lo haga? Solo haga que busquen este MSI y lo envíen (es un pequeño archivo de medio mb), debería tomarles segundos. ACTUALIZACIÓN : necesita varios archivos CAB y MSI; estos se encuentran en la misma carpeta donde se encuentra el MSI. De lo contrario, siempre puedes descargar el SDK de Windows (es gratis, pero es grande, y todo lo que instales ralentizará tu PC). No estoy seguro de qué parte del SDK instala el Orca MSI. Si lo hace, solo edite y agregue detalles aquí.


  • Aquí hay un artículo más completo sobre el tema de la desinstalación de MSI: Desinstalar un archivo MSI de la línea de comandos sin usar msiexec
  • Aquí hay un artículo similar con algunas opciones adicionales para recuperar información MSI utilizando el registro o el msi almacenado en caché: ¿ Encontrar GUID desde el archivo MSI ?

Temas similares (para referencia y fácil acceso, debo limpiar esta lista):

  • Cómo encontrar el Código de actualización y el Código de producto de una aplicación instalada en Windows 7
  • ¿Cómo puedo encontrar el código de actualización para una aplicación instalada en C #?
  • Wix: cómo desinstalar una aplicación instalada previamente que está instalada usando un instalador diferente
  • WiX – Hacer una actualización importante en una instalación de múltiples instancias
  • cómo saber qué productos están instalados; productos más nuevos ya están instalados. Ventanas MSI (usando VBScript)
  • Cómo desinstalar con msiexec utilizando el ID de producto guid sin el archivo .msi presente
  • Buscar el GUID del paquete MSI
Intereting Posts