wix - ¿Cómo puedo comparar el contenido de dos(o más) archivos MSI?
windows-installer msiexec (1)
¿Cómo puedo hacer una " comparación de contenido " de dos (o más) archivos MSI y ver qué es realmente diferente dentro de los archivos, en lugar de hacer una comparación binaria inútil ? (que obviamente solo me dice si estoy tratando con copias del mismo archivo o no).
Algunos escenarios de problemas relevantes y típicos :
- Nuestro sistema de compilación escupe archivos MSI como locos, y a veces necesitamos descubrir qué diferencias existen entre diferentes archivos MSI (léase: algo cambió, y ahora estamos fallando en la implementación).
- Tenemos archivos MSI compilados de las mismas fuentes en diferentes ubicaciones, y algunos de ellos no pueden ejecutar informes System.BadImageFormatException : ¿cómo podemos depurar cuáles son las diferencias en los archivos MSI? (una respuesta que trata este error específicamente aquí: ¿Las aplicaciones dependen del entorno donde se compiló? ).
- Los archivos MSI se pueden compilar con todo tipo de herramientas, pero para los usuarios de stackoverflow, estos archivos probablemente se crean más comúnmente utilizando WiX o Visual Studio Installer Projects (kits de herramientas gratuitos).
Esta es una pregunta de estilo Q / A sobre el tema de comparar sus archivos MSI compilados para determinar qué "diferencias de contenido" reales existen.
About MSI Files
En términos generales, los archivos MSI son archivos de almacenamiento con estructura COM , esencialmente un sistema de archivos dentro de un archivo, con flujos de contenido diferente, uno de los cuales es una base de datos despojada de SQL Server (en el más genérico de los términos, creo). Siempre que los archivos MSI sean legibles, se puede comparar el contenido (de varios formatos y tipos).
Nota técnica
: es concebible que un MSI que desencadena un
System.BadImageFormatException
simplemente no sea ejecutable (
msiexec.exe
no puede ejecutarlo), pero aún así puede ser legible, y por lo tanto comparable (agregue un comentario para verificar esto si usted experimentalo).
Secuencias
: algunas
secuencias
en el MSI son
tablas
con valores de cadena.
También puede haber transmisiones para
archivos cab integrados que se
utilizan para almacenar archivos para implementar, y tablas con
contenido binario
solamente, como la
Binary table
donde las acciones personalizadas compiladas y sin compilar se almacenan junto con otro contenido binario que la configuración necesita.
Y hay una "
secuencia de resumen
" especial y una tabla con iconos almacenados en su formato nativo, binario, y la lista continúa ... Para la mayoría de las tablas, podemos comparar las cadenas en cada tabla de forma muy parecida a como comparamos el texto en un documento de Word (que
también solía ser archivos OLE / COM
, aunque las versiones más recientes ahora usan
Open Office XML
) y obtiene un informe detallado de las diferencias.
Para hacer esto, obviamente necesita una
herramienta de propósito especial
para el trabajo, una capaz de encontrar su camino a través de todos los flujos relevantes.
Algunas herramientas comerciales y gratuitas para esto se enumeran a continuación.
Contenido binario
: antes de elaborar esto, debo tener en cuenta que comparar el contenido en la
Binary Table
, la
Binary Table
Cabs Table
, la
Cabs Table
Icon Table
, o cualquier otra tabla binaria, generalmente solo le permitirá una comparación binaria (especialmente para archivos compilados de acción personalizada dll y exe).
Las acciones personalizadas de script
, en la tabla binaria, se pueden comparar como texto, pero las acciones personalizadas compiladas son solo binarias.
Entonces, si su problema emana de una acción personalizada compilada, realmente no puede verlo en una comparación directa (solo ve la diferencia binaria).
Debe acceder a su sistema de control de fuente para ver qué código se usó para las acciones personalizadas compiladas de cualquier tipo
; es de esperar que tenga una
buena práctica de etiqueta
para poder encontrar el código fuente real utilizado en cada configuración.
No utilizo esta práctica, pero para los lanzamientos corporativos internos, quizás incluso pueda incluir su dll de depuración-compilación para su acción personalizada compilada, e intentar adjuntar el depurador al código en ejecución para realmente descubrir qué está sucediendo.
Sin embargo, no usaría un dll en modo de depuración para un lanzamiento público, a menos que haya aclarado los riesgos.
El código de depuración puede estar plagado de cuadros de mensaje de depuración (inesperados) (utilizados como puntos de entrada para adjuntar el depurador) y otros problemas que nunca deberían afectar a un paquete de producción.
Ahora que lo pienso, sus archivos de cabina y archivos de iconos definitivamente se pueden comparar con sus versiones correspondientes en archivos MSI más antiguos (o más nuevos) utilizando la técnica para descompilar archivos MSI usando
dark.exe
, que se describe a continuación.
Luego, utilizando una buena herramienta de comparación (Beyond Compare se menciona a continuación), puede hacer una diferencia completa en el contenido del archivo cab entre diferentes versiones de MSI (y algunos de los archivos podrían ser archivos de texto, que podrían ser texto comparado).
Supongo que los taxis y los iconos son una especie de "binarios transparentes" en un formato abierto en lugar de binarios compilados (con acciones personalizadas y más) que no son inherentemente descompilables o inspeccionables (a menos que sepa cómo descompilar binarios administrados).
En conclusión : los archivos MSI son completamente transparentes con la excepción de acciones personalizadas compiladas . Esta transparencia es uno de los principales beneficios de MSI . La mayoría de los beneficios de Windows Installer, sobre las tecnologías de implementación anteriores, generalmente se centran en los beneficios de implementación corporativa. Desafortunadamente, los desarrolladores solo pueden ver los aspectos negativos de MSI: los (posibles) antipatrones de MSI (hacia abajo, muy desordenados y ad-hoc por ahora). Es cierto que algunos de estos problemas son muy graves y violan "el principio del menor asombro". Los desarrolladores, por qué tienen otras cosas igualmente importantes que hacer, se pueden dejar francamente rascándose la cabeza con incredulidad.
Sin embargo, no deje ningún error al respecto: MSI tiene enormes beneficios de implementación corporativa ( vea el mismo enlace que el anterior, hacia abajo ). Condensado : funcionamiento silencioso confiable, administración remota, reversión, registro, función de desinstalación implícita, derechos elevados, línea de comando estandarizada, transparencia, transformaciones para personalización de configuración estandarizada e instalación administrativa para extraer archivos de manera confiable. Solo por nombrar a los grandes rápidamente. Beneficios en forma de lista aquí .
Muchas digresiones hasta ahora, vamos al grano . ¿Qué herramientas se pueden usar para comparar archivos MSI?
Commercial Tools
Varias herramientas de implementación comercial como Installshield , Advanced Installer y muchas otras herramientas MSI tienen soporte para ver y comparar archivos MSI. Tal vez agregue demasiados enlaces, pero permítame usar mi política habitual de "si vincula a uno, vincula a todos", debería ahorrar algo de tiempo y algunas búsquedas en Google.
Como nota especial, nostálgica, la mejor característica de MSI-diff que vi fue en Wise Package Studio . Para ser sincero, tenía la cabeza y los hombros por encima del resto: siempre funcionaba, estaba codificado por colores y era fácil de comprender. Esta herramienta ya no está a la venta como se describe aquí: ¿Qué producto de instalación usar? InstallShield, WiX, Wise, Advanced Installer, etc. (si tiene un equipo de empaque en su empresa, ¿tal vez tienen una licencia de repuesto por ahí?).
Free Tools
Las herramientas comerciales son buenas, pero también hay varias alternativas gratuitas que se pueden usar para comparar archivos MSI, y a continuación hay una lista de algunas de ellas junto con algunos consejos sobre cómo usar cada herramienta (de una manera bastante minimalista).
Se agregaron algunos detalles más para
dark.exe
, que no es una herramienta de comparación para archivos de almacenamiento estructurados COM, sino una forma de descompilar archivos MSI en archivos fuente WiX XML y extraer todos los archivos de soporte (iconos, binarios, cabinas, archivos de configuración) - lo que les permite ser comparados con herramientas de comparación de texto / binario después.
1.
Orca
(MSI SDK)
La propia herramienta / visor MSI SDK de Microsoft llamada Orca puede ver archivos MSI y editarlos, pero no hay soporte directo para comparar dos archivos MSI (que yo sepa). Supongo que podría exportar las tablas y luego compararlas, pero otras herramientas tienen más funciones integradas. Se menciona esta opción ya que es posible que ya tenga Orca instalada y, probablemente, esta sea una forma rápida de hacer una diferencia simple. La " opción del pobre ".
Es posible que ya tenga el instalador
.
Si tiene instalado Visual Studio, intente buscar
Orca-x86_en-us.msi
, en
Program Files (x86)
, e instálelo.
Luego encuentra Orca en el menú de inicio.
Técnicamente, Orca se instala como parte del
SDK de Windows
(descarga grande, pero gratuita).
Si no tienes instalado Visual Studio, ¿quizás conoces a alguien que sí?
Solo pídales que busquen este MSI y lo envíen (es un pequeño archivo de medio mb), debería tomarles unos segundos.
Si no, siempre puede descargar el SDK de Windows
2.
Super Orca
(free third party tool)
Super Orca permitirá una comparación rudimentaria de dos archivos MSI. Mi prueba de humo parece revelar que los campos avanzados como el Resumen de flujo pueden ser ignorados. En otras palabras, una tabla recta solo se compara. Podría haber otras limitaciones. Tal vez es lo suficientemente bueno? Es fácil de usar.
3.
widiffdb.vbs
(MSI SDK)
El
MSI SDK
tiene un VBScript que puede usar para ver las diferencias entre dos archivos MSI.
Se llama
widiffdb.vbs
(
widiffdb.vbs
).
Con esta herramienta puedo ver las diferencias de flujo de resumen ignoradas por Super Orca.
Cualquier cosa MSI SDK es autorizada.
ACTUALIZACIÓN : Todos los scripts de la API del SDK de MSI en github.com (el código VBScript real).
-
Agregar un enlace a
la lista completa de dichos VBScripts de SDK de MSI
para diversos fines.
No se confunda, solo se necesita
widiffdb.vbs
para comparar archivos MSI, pero hay muchos scripts útiles para otros fines. -
Si tiene instalado Visual Studio, solo busque
widiffdb.vbs
. Inicie concscript.exe
y pase la ruta completa a dos archivos MSI para compararlos. Salida en consola.
Uso:
cscript.exe widiffdb.vbs "Setup 1.msi" "Setup 2.msi"
Salida de muestra:
Property Value [ALLUSERS] {1}->{2}
Property Value [MSIINSTALLPERUSER] {}->{1}
Property INSERT [MSIINSTALLPERUSER]
/005SummaryInformation [9] {{00000000-0000-0000-0000-000000000000}}->{{00000000-0000-0000-0000-000000000001}}
/005SummaryInformation [12] {28.03.2019 15:20:02}->{28.03.2019 14:40:52}
/005SummaryInformation [13] {28.03.2019 15:20:02}->{28.03.2019 14:40:52}
/005SummaryInformation [15] {2}->{10}
Para encontrar el script, puede buscarlo en
Program Files (x86)
si tiene instalado Visual Studio (es parte del SDK de Windows que también se instalará junto con Visual Studio) - (actualmente la ruta es:
C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86
: simplemente reemplace los números de versión según corresponda y debería encontrar el MSI más rápido).
4.
dark.exe
(WiX toolkit - open source)
El binario
dark.exe
del
conjunto de herramientas WiX
(un conjunto de herramientas que probablemente se usó para compilar algunos de sus archivos MSI).
Este
dark.exe
es un "desensamblador" o "descompilador" para archivos MSI.
Convertirá archivos MSI al formato
wxs
XML (el propio formato de WiX utilizado para compilar archivos MSI en primer lugar), junto con una serie de archivos binarios extraídos (si usa las opciones y marcas de descompilación correctas).
Los archivos fuente
wxs
se pueden comparar como archivos fuente de texto normales (mi herramienta favorita para esto es
Beyond Compare
, pero es una herramienta comercial, hay muchas herramientas de comparación de texto, incluidas las de Visual Studio).
Los archivos binarios obviamente pueden ser binarios comparados.
Cualquier archivo CAB extraído se puede comparar con otro archivo de cabina similar de otra versión de configuración de MSI, por ejemplo.
Aquí hay una línea de comando de muestra:
dark.exe -x outputfolder MySetup.msi
-
En muchos casos, esto proporcionará una muy buena comparación de los archivos MSI y debería poder determinar qué es realmente diferente.
-
Los archivos binarios extraídos pueden ser archivos de script (VBScripts, etc.) o cualquier otro número de archivos binarios (por ejemplo, acciones personalizadas de DLL compiladas). En el último caso, realmente no puede descompilarlo aún más, a menos que sea un binario .NET y tenga experiencia en descompilar dichos binarios.
-
Sin embargo, debe tenerse en cuenta que los archivos MSI generados por WiX compilados usando exactamente los mismos archivos fuente de WiX pueden ser diferentes por un par de razones:
-
El mismo archivo fuente de WiX también se puede compilar con diferentes configuraciones de compiler y linker , y esto puede afectar el archivo MSI generado de varias maneras diferentes. Para ver todos los interruptores, descargue e instale WiX y simplemente escriba
candle.exe
olight.exe
en el símbolo del sistema ylight.exe
enter . -
Ciertos campos, como los GUID de paquetes y los GUID de productos, se pueden configurar para que se generen automáticamente en el archivo wxs. El campo correspondiente resultante en el archivo MSI generado obviamente será diferente para cada compilación en este caso.
-
No tengo una lista completa de qué campos se pueden configurar para autogenerarse en este momento (si sabe, tal vez presione editar y modificar esto in situ).
-
Los campos autogenerados mencionados también se pueden codificar (lo cual no es bueno para el GUID del paquete, pero esa es otra larga historia: solo sepa que si encuentra dos archivos MSI que son binarios diferentes con el mismo GUID del paquete, entonces usted está en serios problemas, si están en la naturaleza, Windows Installer los tratará como el mismo archivo por definición). Los códigos de paquete siempre deben generarse automáticamente. Digresión.
-
-
Los propios archivos MSI obviamente tienen información de fecha de archivo diferente que se ha compilado por separado, solo para decir lo obvio.
-
Y una nota especial algo no relacionada con el tema en cuestión, pero importante de todos modos: puede usar
dark.exe
para descompilar ejecutables compilados con la función Grabar de WiX.
Esta es la
función de arranque
de WiX utilizada para instalar uno o más archivos MSI y / o EXE en secuencia, uno tras otro.
Estos bootstrappers son archivos EXE y puede descomprimirlos en sus archivos MSI y / o EXE constituyentes:
dark.exe -x outputfolder setup.exe
Simplemente abra un símbolo del sistema, CD en la carpeta donde reside el setup.exe.
Luego especifique el comando anterior.
Muestra concreta:
dark.exe -x outputfolder MySetup.exe
.
La carpeta de salida contendrá un par de subcarpetas que contienen archivos MSI y EXE extraídos y manifiestos y archivos de recursos para la GUI Burn.
Cualquier archivo MSI se puede desmontar como se describe anteriormente para producir un archivo fuente WiX (wxs).
5.
InstEd
(free third party tool - with plus version available)
Por alguna razón, nunca he usado esta herramienta activamente, pero la probé varias veces. Al probarlo nuevamente, parece hacer el trabajo de comparar dos archivos MSI, aunque sea una extraña opción de menú (lo que me hizo pensar que la función no funcionaba antes).
-
Abra un MSI, luego vaya a
Transform => Compare Against...
y busque el MSI con el que desea comparar el primero. - La comparación parece estar bien, y veo que hay cambios en la secuencia de resumen, por ejemplo, pero la diferencia no parece mostrar lo que es diferente (a menos que simplemente no lo vea).
-
Para ver los cambios del flujo de resumen, abra ambos archivos en instancias de InstEd separadas y vaya a
Tables => Summary Info...
en ambas instancias. Ahora compare la información en las hojas de propiedades. Alternativamente, use el scriptwidiffdb.vbs
mencionado anteriormente.
6.
Other Tools...
(COM-structured storage file viewers)
No hay duda de que hay muchas otras herramientas capaces de ver archivos de almacenamiento estructurados COM, pero creo que las opciones anteriores deberían ser suficientes para la mayoría de los usuarios. Agregaré un enlace a la lista de herramientas de MSI de installsite.org nuevamente.
7.
Advanced Installer
(commercial tool with some free features)
Esta herramienta comercial podrá funcionar como un visor y permitir algunas operaciones básicas en archivos MSI incluso sin ejecutar con una licencia completa. Lo bueno es que ni siquiera necesita usar las tablas en bruto, sino que puede usar una interfaz de usuario mucho mejor para "reparar" varias cosas en el MSI. Por ejemplo, varios parámetros de actualización (continuar o fallar cuando fallan las desinstalaciones de actualizaciones importantes, etc.).
Los cambios realizados en la vista del Editor de tablas ( vista de tabla directa) no serán visibles en las otras "vistas de asistente". La razón de esto se explica aquí .