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

Necesito encontrar el GUID del producto de un archivo MSI instalado para poder realizar tareas de mantenimiento como parchear, desinstalar (cómo desinstalar) y también para finalidades de auditoría.

Solución

Para la recuperación del código de actualización: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095

Versión corta

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

  1. `Utilizar el Powershell "one-liner"

    Desplácese hacia abajo para ver la captura de pantalla y el paso a paso. Descargo de responsabilidad también abajo - riesgos menores o moderados dependiendo de a quién le preguntes. A mí me funciona bien. Cualquier auto-reparación desencadenada por esta opción debería ser generalmente posible de cancelar. La comprobación de la integridad del paquete que se desencadena añade algo de "ruido" al registro de eventos. ¡Nota! El número de identificación es el código del producto (peculiaridad de WMI).

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

Inicio rápido de Powershell: mantener la tecla Windows, tocar R, escribir "powershell" y pulsar Enter 2. Utilizar VBScript.

Descrito más adelante en "Herramientas alternativas" (sección 3). Esta opción puede ser más segura que Powershell por razones que se explican en detalle más adelante. En esencia es (mucho) más rápida* y no es capaz de activar la auto-reparación de MSI ya que no pasa por WMI (accede a la API COM de MSI directamente - a una velocidad de vértigo). Sin embargo, es más complicado que la opción Powershell* (varias líneas de código). 3. Registry Lookup (búsqueda en el registro)

Algunos juran por buscar cosas en el registro. No es mi enfoque recomendado - me gusta ir a través de las APIs apropiadas (o en otras palabras: llamadas a funciones del SO). Siempre hay excepciones extrañas que sólo se explican por los internos de la implementación de la API:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLMSOFTWAREWOW6432NodeMicrosoftWindowsCurrentVersionUninstall
  • HKCUSoftwareMicrosoftWindowsCurrentVersionUninstall
  1. Archivo MSI original / Fuente WiX

    Puede encontrar el Código de producto en la Tabla de propiedades de cualquier archivo MSI (y cualquier otra propiedad también). Sin embargo, el GUID podría (raramente) ser anulado por una transformación aplicada en el momento de la instalación y, por tanto, no coincidir con el GUID con el que está registrado el producto (los enfoques 1 y 2 anteriores informarán del código real del producto - que está registrado en Windows - en estos raros escenarios). Necesita una herramienta para ver los archivos MSI. Vea hacia el final de la siguiente respuesta una lista de herramientas gratuitas que puede descargar (o vea la opción rápida más abajo): https://stackoverflow.com/questions/48482545/how-can-i-compare-the-content-of-two-or-more-msi-files/48482546#48482546 ACTUALIZACIÓN: Para mayor comodidad y necesidad de velocidad :-), descargue SuperOrca sin demora y sin problemas desde este enlace directo de descarga - la herramienta es lo suficientemente buena para hacer el trabajo - instale, abra el MSI y vaya directamente a la tabla de propiedades y encuentre la fila ProductCode (por favor, compruebe siempre el virus de un enlace directo de descarga - obviamente - puede utilizar virustotal.com para hacerlo - escaneo en línea utilizando docenas de antivirus y suites de malware para escanear lo que subes).

    Orca es una herramienta propia de Microsoft' se instala con Visual Studio y el SDK de Windows. Intente buscar Orca-x86_en-us.msi - en Program Files (x86) e instala el MSI si lo encuentras.

    Y a continuación encontrará la respuesta original que "orgánicamente creció" en un montón de detalles. Tal vez ver "Desinstalar paquetes MSI**" sección de abajo si esta es la tarea que necesita para llevar a cabo.

    Recuperar Códigos de Producto

    Actualización: Si también necesitas el código de actualización, consulta esta respuesta: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095 (recupera los códigos de producto asociados, los códigos de actualización & los nombres de los productos en una tabla de salida - similar a la de abajo).

    • ¿No puede usar PowerShell? Vea la sección "Herramientas alternativas" más abajo. Ver la sección "Desinstalar paquetes MSI" más abajo. Inicie Powershell (mantenga pulsada la tecla Windows, pulse R, suelte la tecla Windows, escriba "powershell" y pulse OK) y ejecute el siguiente comando para obtener una lista de los códigos de producto de los paquetes 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 comandos, por favor, lea el descargo de responsabilidad a continuación (nada peligroso, sólo algunas molestias potenciales). La sección 3 bajo "Herramientas alternativas" muestra una forma alternativa no WMI para obtener la misma información utilizando VBScript. Si usted está tratando de desinstalar un paquete hay una sección de abajo con algunos ejemplos de líneas de comando msiexec.exe:
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

El resultado debería ser similar a este: {{32441319}}} La salida debería ser similar a esta: {{32441319}}} *Nota: Por alguna extraña razón el "ProductCode" se refiere como *"IdentifyingNumber" en WMI. Así que en otras palabras - en la imagen de arriba el IdentifyingNumber es el ProductCode. Si necesita ejecutar esta consulta de forma remota contra muchos ordenadores remotos*, vea la sección "Recuperar los códigos de producto de un ordenador remoto" más abajo. DISCLAIMER (importante, por favor lea antes de ejecutar el comando): Debido a un extraño diseño de Microsoft, cualquier llamada WMI a Win32_Product. (como el comando PowerShell de abajo) desencadenará una **validación del

estado del paquete. Además de ser bastante lento*, esto puede en raros casos desencadenar una auto-reparación de MSI. Esto puede ser un pequeño paquete o algo enorme - como Visual Studio. En la mayoría de los casos esto no sucede - pero hay un riesgo. No ejecute este comando justo antes de una importante reunión - no es nunca peligroso (es de sólo lectura), pero podría llevar a una larga reparación en casos muy raros* (creo que se puede cancelar la auto-reparación también - a menos que se impida activamente por el paquete en cuestión, pero se reiniciará si usted llama Win32_Product de nuevo y esto persistirá hasta que dejes que la auto-reparación termine - a veces puede continuar incluso si la dejas terminar: https://stackoverflow.com/questions/5501028/how-can-i-determine-what-causes-repeated-windows-installer-self-repair/6066263#6066263).

Y sólo para que conste: algunas personas informan de que sus registros de eventos se llenan de entradas MsiInstaller EventID 1035 (ver la respuesta del jefe de código) - aparentemente causado por consultas WMI a la clase Win32_Product (personalmente nunca he visto esto). Esto no está directamente relacionado con el comando Powershell sugerido arriba, está en el contexto del uso general de la clase WIM Win32_Product. También puede obtener la salida en forma de lista (en lugar de tabla):

get-wmiobject -class Win32_Product

En este caso, la salida es similar a esto: introduzca aquí la descripción de la imagen

Recuperar los códigos de producto de un ordenador remoto

En teoría, debería poder especificar el nombre del ordenador remoto como parte del propio comando. Aquí está el mismo comando de arriba configurado para ejecutarse en la máquina "RemoteMachine" (Nombre de la computadora RemoteMachine sección añadida):

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

Esto puede funcionar si se ejecuta con 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 añadir las credenciales de usuario directamente a las llamadas WMI para que funcione. Además, las conexiones remotas en WMI se ven afectadas por (al menos) el Firewall de Windows, la configuración de DCOM, y el Control de cuentas de usuario (UAC) (además de cualquier factor adicional ajeno a Microsoft - por ejemplo, firewalls reales, firewalls de software de terceros, software de seguridad de varios tipos, etc...). Que funcione o no depende de su configuración exacta.

  • Configuración de una conexión remota de WMI
  • Conexión a WMI de forma remota con PowerShell]11 ACTUALIZACIÓN: Una sección extensa sobre la ejecución de WMI remoto se puede encontrar en esta respuesta: https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095. Parece que una regla de cortafuegos y la supresión del aviso UAC a través de un ajuste del registro pueden hacer que las cosas funcionen en un entorno de red de grupo de trabajo. No son cambios recomendados en cuanto a la seguridad, pero a mí me funcionó.

    Herramientas alternativas

    PowerShell requiere que se instale el .NET framework (actualmente en la versión 3.5.1 parece... octubre, 2017). La propia aplicación PowerShell también puede faltar en la máquina aunque esté instalado .NET. Por último creo que PowerShell puede estar desactivado o bloqueado por diversas políticas y privilegios del sistema. Si este es el caso, puedes probar otras formas de recuperar los códigos de producto. Mi alternativa preferida es VBScript - es rápido y flexible (pero también puede estar bloqueado en ciertas máquinas, y el scripting es siempre un poco más complicado que el uso de herramientas).

  1. Empecemos con una herramienta WMI incorporada de Windows: wbemtest.exe.
  • Inicie wbemtest.exe (Mantenga pulsada la tecla Windows, pulse R, suelte la tecla Windows, escriba "wbemtest.exe" y pulse OK).
  • Haga clic en conectar y luego en Aceptar (el espacio de nombres es, por defecto, root\cimv2), y haga clic en "conectar" de nuevo.
  • Haga clic en "Query" y escriba este comando WQL (sabor SQL): SELECT IdentifyingNumber,Name,Version FROM Win32_Product y haga clic en "Use" (o su equivalente - la herramienta estará localizada).
  • Captura de pantalla de muestra (truncada). No es el mejor formato, pero puede obtener los datos que necesita. **El número de identificación es el código de producto MSI:
  1. A continuación, puedes probar una herramienta WMI personalizada, más completa, como WMIExplorer.exe.
  • Esta no está incluida en Windows. Sin embargo, es una herramienta muy buena. Se recomienda.
  • Compruébalo en: https://github.com/vinaypamnani/wmie2/releases
  • Inicie la herramienta, haga clic en Connect, haga doble clic en ROOT\CIMV2
  • En la pestaña "Consulta**", escriba la siguiente consulta SELECT IdentifyingNumber,Name,Version FROM Win32_Product y pulse Ejecutar.
  • Captura de pantalla omitida, la aplicación requiere demasiado espacio en pantalla.
  1. Por último, puedes probar un VBScript para acceder a la información a través de la interfaz de automatización MSI (característica principal de Windows - es sin relación con WMI).
  • Copie el siguiente script y péguelo en un archivo *.vbs en su escritorio, e intente ejecutarlo haciendo doble clic. Su escritorio debe ser escribible para usted, o puede utilizar cualquier otra ubicación escribible.
  • Este no es un gran VBScript. Se ha preferido el manejo de errores y la exhaustividad, pero debería hacer el trabajo con la mínima complejidad.
  • El archivo de salida se crea en la carpeta desde la que se ejecuta el script (la carpeta debe tener permisos de escritura). El archivo de salida se llama msiinfo.csv.
  • Haga doble clic en el archivo para abrirlo en una aplicación de hoja de cálculo, seleccione la coma como delimitador en la importación - O - simplemente abra el archivo en el Bloc de notas o en cualquier visor de texto.
  • Si se abre en una hoja de cálculo, se podrán utilizar funciones avanzadas de clasificación.
  • Este script puede ser fácilmente adaptado para mostrar una cantidad significativa de detalles adicionales sobre la instalación del MSI. Una demostración de esto se puede encontrar aquí: https://stackoverflow.com/questions/28963089/how-to-find-out-which-products-are-installed-newer-product-are-already-install/28971679#28971679. lenguaje: vbscript -->
' 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

De momento no se me ocurren más opciones de propósito general para recuperar los códigos de los productos, por favor, añade si conoces alguna. Sólo edita en línea en lugar de añadir demasiados comentarios, por favor.

Ciertamente puede acceder a esta información desde su aplicación llamando a la interfaz de automatización de MSI (basada en COM) O al C++ MSI installer functions (Win32 API). O incluso utilizando consultas WMI desde dentro de su aplicación como se hace en los ejemplos anteriores utilizando PowerShell, wbemtest.exe o WMIExplorer.exe.

Desinstalar paquetes MSI

Si lo que quieres hacer es desinstalar el paquete MSI del que has encontrado el código de producto, puedes hacerlo de la siguiente manera utilizando un servicio de comandos elevado (busca cmd.exe, haz clic con el botón derecho y ejecuta como administrador): Opción 1: Desinstalación básica e interactiva sin registro (rápida y sencilla):

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

Explicación rápida de los parámetros:

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

También puede habilitar el registro (verboso) y ejecutar en modo silencioso si lo desea, lo que nos lleva a la opción 2: Opción 2: Desinstalación silenciosa con registro verboso (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 de los parámetros:

/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

Hay una completa referencia para la desinstalación de MSI aquí (varias formas diferentes de desinstalar paquetes MSI): https://stackoverflow.com/questions/450027/uninstalling-an-msi-file-from-the-command-line-without-using-msiexec/1055933#1055933. Hay una plétora de diferentes maneras de desinstalar. *Si está escribiendo un archivo por lotes, por favor, eche un vistazo a la sección 3 de la respuesta anterior, enlazada, para algunas variantes de línea de comandos de desinstalación comunes y estándar. Y un enlace rápido a msiexec.exe (opciones de línea de comandos) (resumen de la línea de comandos para msiexec.exe de MSDN). Y también la versión de Technet.

Recuperación de otras propiedades / información del MSI (por ejemplo, el código de actualización)

Actualización: por favor, encuentre una nueva respuesta sobre cómo encontrar el código de actualización de los paquetes instalados en lugar de buscar manualmente el código en los archivos MSI. Para paquetes instalados esto es mucho más fiable. Si el paquete no está instalado, todavía tiene que buscar en el archivo MSI (o en el archivo fuente utilizado para compilar el MSI) para encontrar el código de actualización. Dejando en la sección más antigua a continuación: Si desea obtener el Código de actualización u otras propiedades del MSI, puede abrir el MSI de instalación en caché para el producto desde la ubicación especificada por "LocalPackage" en la imagen que se muestra arriba (algo así como C:\WINDOWS\Installer\50c080ae.msi - es un nombre de archivo hexadecimal, único en cada sistema). A continuación, busque en la "Tabla de propiedades" para UpgradeCode (es posible que el UpgradeCode para ser redefinido en una transformación - para estar seguro de obtener el valor correcto que necesita para recuperar el código mediante un programa del sistema - Voy a proporcionar una secuencia de comandos para esto en breve. Sin embargo, el UpgradeCode encontrado en el MSI almacenado en caché es generalmente correcto). Para abrir los archivos MSI almacenados en caché, utiliza Orca u otra herramienta de empaquetado. Aquí hay una discusión de diferentes herramientas (cualquiera de ellas servirá): https://stackoverflow.com/questions/1544292/what-installation-product-to-use-installshield-wix-wise-advanced-installer/1546941#1546941. Si no tienes una herramienta de este tipo instalada, tu apuesta más rápida podría ser probar Super Orca (es sencilla de usar, pero no ha sido probada extensamente por mí). Actualización: aquí hay una nueva respuesta con información sobre varios productos gratuitos que puedes usar para ver archivos MSI: https://stackoverflow.com/questions/48482545/how-can-i-compare-the-content-of-two-or-more-msi-files/48482546#48482546 Si tienes Visual Studio instalado, intenta buscar Orca-x86_en-us.msi - en Archivos de programa (x86) - e instálalo (es el visor y editor MSI oficial de Microsoft). A continuación, busque Orca en el menú de inicio. Ir tiempo en ningún momento :-). Técnicamente, Orca se instala como parte del SDK de Windows (no de Visual Studio), pero el SDK de Windows está incluido en la instalación de Visual Studio. Si no tienes Visual Studio instalado, quizás conozcas a alguien que lo tenga. Sólo tienes que pedirles que busquen este MSI y te lo envíen (es un pequeño archivo de medio mb) - debería llevarles unos segundos. Actualización**: necesitas varios archivos CAB además del MSI - estos se encuentran en la misma carpeta donde se encuentra el MSI. Si no, siempre puedes descargar el Windows SDK (es gratis, pero es grande - y todo lo que instales ralentizará tu PC). No estoy seguro de qué parte del SDK instala el MSI de Orca. Si lo haces, por favor edita y añade los detalles aquí.

Comentarios (6)

Si usted tiene demasiados instaladores para encontrar lo que está buscando fácilmente, aquí es un poco de powershell para proporcionar un filtro y reducir un poco por el nombre de la pantalla.

$filter = "*core*sdk*"; (Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall).Name | % { $path = "Registry::$_"; Get-ItemProperty $path } | Where-Object { $_.DisplayName -like $filter } | Select-Object -Property DisplayName, PsChildName
Comentarios (0)