windows-installer - para - ejecutar archivos msi
¿La solución más simple para reemplazar un archivo pequeño dentro de un MSI? (4)
Debe agregar una entrada a la tabla de Medios , agregando otro medio sin archivo contenedor, y una Última Secuencia una más que la última secuencia del archivo CAB. Luego debe reemplazar en la tabla de archivos la secuencia del archivo con el nuevo archivo y actualizar todos los demás atributos de archivo que pueden haber cambiado.
Muchos de nuestros clientes tienen acceso a InstallShield, WISE o AdminStudio. Estos no son un problema. Espero que haya alguna forma en que pueda proporcionar a nuestros clientes más pequeños sin acceso a las herramientas de reempaquetado comercial un conjunto de herramientas disponibles gratuitamente y los pasos necesarios para realizar el reemplazo del archivo por su cuenta.
Solo se necesita reemplazar un único archivo de configuración dentro de un MSI comprimido, se puede suponer que el usuario objetivo ya tiene instalado Orca, saber cómo usarlo para personalizar la tabla de propiedades (para incrustar detalles de licencia para la implementación de GPO) y haber generado un archivo MST .
Descargo de responsabilidad : esto es muy similar a otra pregunta, pero ambas preguntas y respuestas en ese hilo no son claras.
Supongo que usted mismo crea el archivo msi (?)
Cuando utiliza Wix para generar su msi, el cliente puede simplemente regenerar todo el msi después de reemplazar el archivo (wix es gratuito). De lo contrario, debería ser posible usar un archivo descomprimido que no esté integrado en el msi. En wix debe agregar un elemento multimedia sin un atributo de gabinete. La desventaja es que tiene que distribuir dos archivos, en lugar de un solo msi.
En mi humilde opinión, este tipo de escenario indica una característica faltante en la aplicación que se está instalando, y es más fácil de solucionar en la aplicación que piratear con el MSI.
Imagen de administrador
Permítanme decir primero que una forma sencilla de "resolver" esto para sus usuarios es decirles que ejecuten una instalación de administrador de su MSI. Esto básicamente extraerá todos los archivos de los CAB internos y colocará todos los archivos en la carpeta especificada:
msiexec.exe / a myinstaller.msi TARGETDIR = C: / AdminImage
Sus usuarios pueden ir directamente a la estructura de la carpeta extraída y actualizar el archivo en cuestión y luego asignar el directorio a otras PC e instalar el MSI. Podría haber efectos secundarios a esto relacionado con el archivo que tiene un valor hash en el MSI (para evitar el spoofing), pero en la mayoría de los casos funciona bien.
Ejecutar XML XPath Query
Las nuevas versiones de herramientas de implementación, como Installshield y Wix, cuentan con soporte integrado para ejecutar consultas XPath durante la instalación y, por lo tanto, escribir secciones dinámicamente.
Actualización de la aplicación
Configurar una aplicación en una PC implica varios pasos. Primero está el despliegue de contenido en la máquina; esto se debe hacer usando una MSI, no hay dudas al respecto. Sin embargo, en la mayoría de las aplicaciones avanzadas, se requieren varias "tareas de configuración posteriores a la instalación" similares a esta "actualización de archivo de configuración".
Casi siempre es mejor aplazar estas tareas de configuración hasta el lanzamiento de la aplicación , en lugar de implementar funciones en el MSI. Hay muchas razones para esto, pero lo más importante es que solo se garantizará que la aplicación EXE se ejecute en el contexto de usuario correcto. Los archivos MSI pueden ejecutarse con derechos del sistema, una cuenta de usuario diferente o mediante algún otro mecanismo.
Lo que generalmente recomendamos es usar el MSI para obtener todo el contenido requerido en la PC . A continuación, marque el registro para indicar a la aplicación que es el primer lanzamiento (para las actualizaciones, puede incrementar un contador o escribir el nuevo número de versión en HKLM). Luego, la aplicación puede realizar los pasos de configuración finales en su rutina de inicio. Puede copiar un archivo config.xml predeterminado desde algún lugar en% ProgramFiles% y copiarlo en el perfil del usuario. Luego puede leer los valores requeridos de HKLM escritos por el MSI, y luego actualizar el archivo config.xml con estos valores.
En general: evite los pasos de configuración realizados por MSI o cualquier otro mecanismo de configuración. Concéntrese en escribir los archivos necesarios y los elementos de registro en la máquina, y luego deje que la aplicación configure un entorno de tiempo de ejecución adecuado. Esto permitirá un mejor control de implementación. Es mejor "Encapsulación" si lo desea. El MSI envía un "mensaje" a la aplicación a través del registro, y la aplicación sabe "cómo establecerse correctamente" en función de los mensajes.
De acuerdo, revisando esta pregunta con mi propia respuesta, proporcionando un pequeño y agradable script de VB que hará todo el trabajo pesado. Como se mencionó en la pregunta original, el objetivo fue proporcionar una solución simple para que los usuarios de sysadmin realicen las actualizaciones / cambios por sí mismos.
A continuación hay una versión simplificada del código que actualmente estoy brindando a los clientes
Option Explicit
Const MY_CONFIG = "MyConfigApp.xml"
Const CAB_FILE = "config.cab"
Const MSI = "MyApp.msi"
Dim filesys : Set filesys=CreateObject("Scripting.FileSystemObject")
If filesys.FileExists("temp.tmp") Then filesys.DeleteFile("temp.tmp")
filesys.CopyFile MSI, "temp.tmp"
Dim installer, database, database2, view
Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase ("temp.tmp", 1)
Set database2 = installer.OpenDatabase (MSI, 1)
If Not filesys.FileExists(MY_CONFIG) Then WScript.Quit 2 '' No config file, abort!
Dim objFile, size, result, seq, objCab
'' MakeCab object has been depreciated so we fallback to makecab.exe for with Windows 7
On Error Resume Next '' Disable error handling, for a moment
Set objCab = CreateObject("MakeCab.MakeCab.1")
On Error Goto 0 '' Turn error handling back on
If IsObject(objCab) Then '' Object creation successful - use XP method
objCab.CreateCab CAB_FILE, False, False, False
objCab.AddFile MY_CONFIG, filesys.GetFileName(MY_CONFIG)
objCab.CloseCab
Set objCab = Nothing
Else '' object creation failed - try Windows 7 method
Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("makecab " & filesys.GetFileName(MY_CONFIG) & " " & CAB_FILE)
End If
Set objFile = filesys.GetFile(MY_CONFIG)
size = objFile.Size
Set view = database.OpenView ("SELECT LastSequence FROM Media WHERE DiskId = 1")
view.Execute
Set result = view.Fetch
seq = result.StringData(1) + 1 '' Sequence for new configuration file
Set view = database.OpenView ("INSERT INTO Media (DiskId, LastSequence, Cabinet) VALUES (''2'', ''" & seq & "'', ''" & CAB_FILE & "'')")
view.Execute
Set view = database.OpenView ("UPDATE File SET FileSize = " & size & ", Sequence = " & seq & ", FileName = ''MYC~2.CNF|MyConfigApp.xml'' WHERE File = ''" & MY_CONFIG & "''")
view.Execute
database.GenerateTransform database2, "CustomConfig.mst"
database.CreateTransformSummaryInfo database2, "CustomConfig.mst", 0, 0
filesys.DeleteFile("temp.tmp")
Set view = nothing
Set installer = nothing
Set database = nothing
Set database2 = nothing
Set filesys = Nothing
WScript.Quit 0
Actualización: el objeto MakeCab.MakeCab.1 se ha depreciado, el código actualizado ahora funciona con Windows 7.