programas para msi mac cómo convertir convertidor archivos abrir wix windows-installer

wix - mac - programas para abrir msi



¿Se puede instalar un archivo.msi(presumiblemente a través de una acción personalizada)? (6)

Me gustaría construir un MSI que, en su proceso de instalación, se desplegará junto con sus Archivos / Componentes contenidos, en el TargetDir.

Así que MyApp.msi contiene MyApp.exe y MyAppBootstrapperEmpty.exe (sin recursos) en su tabla de archivos.

El usuario inicia un MyAppBootstrapperPackaged.exe (que contiene MyApp.msi como recurso, obtenido de Internet en alguna parte, o correo electrónico o de otro modo). MyAppBootStrapperPackaged.exe extrae MyApp.msi en una carpeta temporal y lo ejecuta a través de msiexec.exe.

Una vez que se completa el proceso msiexec.exe, quiero MyApp.msi, MyBootstrapperEmpty.exe (AND MyApp.exe en la carpeta% ProgramFiles% / MyApp para que MyApp.exe pueda tener acceso seguro a MyApp.msi cuando se ejecuta (para crear el siguiente contenido empaquetado mencionado).

MyAppBootstrapper * .exe podría intentar copiar MyApp.msi en la carpeta% ProgramFiles% / MyApp, pero necesitaría elevación para hacerlo, y no permitiría su eliminación mediante el proceso de desinstalación de Windows Installer (desde Agregar / Quitar Programas o de otro modo), que debe ser preservado.

Obviamente (creo que es obvio, ¿me equivoco?) No puedo incluir el MSI como un archivo en mi Media / CAB (situación del huevo y la gallina), así que creo que tendría que hacerse a través de una acción personalizada antes de la instalación. proceso, agregando el MSI original al Media / CAB del MSI DB y la entrada correspondiente en la tabla de archivos sobre la marcha. Se puede hacer esto? Y si se puede, cómo?

Piense en un modelo de distribución de contenido donde los archivos de contenido solo se distribuyan junto con la aplicación. El contenido es producido por el usuario final a través de la aplicación en tiempo de ejecución y empaquetado en un EXE distribuible que incluye tanto la aplicación como el contenido.

El instalador de MyApp debe seguir siendo un MSI, pero puede ejecutarse mediante un EXE de Bootstrapper. El MyApp.exe instalado debe tener acceso a ambos MyApp.msi y EXE debe ser "ensamblado" en tiempo de ejecución por la aplicación desde una base (vacía) MyAppBootstrapper.exe, que también está instalada por el MSI, y el contenido creado por el usuario final. El MSI de recursos del EXE debe ser el mismo que el utilizado para instalar la aplicación que está realizando el empaquetado en tiempo de ejecución.

WIX no debe instalarse con MyApp.

No puede haber dependencias de red en el tiempo de ejecución / empaquetado (es decir, no se puede hacer el empaquetamiento a través de un servicio web; debe hacerse localmente).

Estoy familiarizado con (y el uso de) Acciones personalizadas (administradas y no administradas, a través de DTF y de otro modo).


Entonces, si lo entiendo, entonces creo que la aplicación creará una transformación (MST) que tenga los archivos de contenido y los aplicará a la base MSI. Todavía no estoy convencido de que lo entiendo. :)


Tener un paquete .MSI ejecutando otro paquete .MSI desde "dentro" se llama instalación anidada , y está mal juju (ver la Regla 20). Windows Installer tiene algunos datos globales que usa para administrar la instalación actual, y no maneja bien varias instalaciones al mismo tiempo. Por la misma razón, si comienza una instalación y luego intenta iniciar otra mientras la primera todavía está en progreso, generalmente verá una ventana emergente con el efecto de "otra instalación en progreso, espere hasta que termine".

Puedes tener un programa, generalmente llamado "bootstrapper" (creo que a eso te refieres) que no es un paquete de instalación, pero que contiene un paquete de instalación (como .MSI o .EXE) como recurso, posiblemente comprimido. La acción del programa bootstrapper es extraer / expandir el recurso a un archivo, comúnmente en un directorio %TEMP% , luego lanzar el .EXE extraído o ejecutar MSIEXEC en el .MSI extraído. El programa de arranque puede contener múltiples recursos y extraerlos + instalarlos uno por uno, si necesita instalar prerrequisitos antes del paquete principal. O puede enviar paquetes múltiples como archivos separados, y hacer que el programa de arranque los ejecute / instale directamente desde el medio de distribución uno por uno, o cópielos a la máquina de destino y ejecute la serie de instalación desde allí, o ...

WiX en sí mismo no se instala, no. Es una herramienta con la que se pueden construir paquetes .MSI. El proyecto WiX tiene en su lista de deseos un programa de bootstrapper genérico, pero aún no se ha implementado. Hay otros arrancadores disponibles, por ejemplo, este .

No necesitará una acción personalizada; de hecho, dado que el programa de arranque no es un paquete de instalación de Windows Installer, la "acción personalizada" no tiene ningún significado. Y, si está lo suficientemente familiarizado con las CA para saber sobre DTF gestionado / no gestionado, entonces sabrá lo suficiente como para evitar acciones personalizadas siempre que sea posible. (mueca)


Creo que es mucho más fácil para el programa de arranque extraer el archivo MSI a una ubicación predefinida en lugar de a la carpeta temporal. Por ejemplo, en C: / Documents and Settings / All Users / Application Data / My Company / My Product Install Cache. Después de que termine la instalación, bootstrapper dejará el archivo MSI allí. Si en algún momento el usuario decide reinstalar su producto, Windows Installer podrá ubicar el archivo MSI de origen.

Además, agregue la ruta a este archivo a la tabla RemoveFile para que se elimine en la desinstalación. Puede usar el elemento RemoveFile en WiX para eso.


Configuraría la ruta del caché de MSI a una ubicación conocida.

Luego, en el tiempo de ejecución, si necesita "editar" el MSI, use VBScript o similar.

Pero aún así, pregunto ¿POR QUÉ?


También estoy trabajando en una forma de implementar múltiples archivos MSI. Tengo un programa bootstrapper.exe que agrupa los archivos MSI y los ejecuta uno a la vez. Esto resuelve mi problema para la mayoría de los casos.

El caso que no resuelve es la distribución de GPO (Global Policy Object) de la instalación. GPO requiere un archivo dot-msi para ejecutar una instalación.

Para hacer esto, esto es lo que hice, que casi resolvió el problema (pero no del todo). Puse los archivos dot-msi en la tabla de archivos de un instalador y puse mi bootstrapper en la tabla binaria y la ejecuté desde una acción personalizada insertada después de InstallFinalize en InstallExecuteSequence. Por supuesto, el bootstrapper no podrá ejecutar otros MSI porque el MSI de nivel superior contiene el mutex _MSIExecute.

Fue bastante fácil llegar un poco más allá. Hice que el controlador de arranque devuelva el control al instalador de nivel superior y continúe. Y luego agregué una llamada WaitForSingleObject para esperar a que termine la instalación de nivel superior, y el programa de arranque puede continuar para finalizar la instalación.

Mi problema es que la instalación de GPO ocurre en el momento del arranque y la instalación de nivel superior se completa antes de que los subinstaladores finalicen y el GPO reinicie la máquina.

La instalación de nivel superior también devuelve un estado de éxito cuando la instalación puede fallar más adelante.

Todavía estoy buscando una forma de bloquear la instalación de nivel superior hasta que finalice el proceso de arranque.


Agregue un medio sin comprimir a sus wxs de esta manera:

<Media Id=''2''/>

Y luego crea un componente con un elemento de archivo como este:

<File Source=''/path/to/myinstaller.msi'' Compressed=''no'' DiskId=''2'' />

Esto hará que el instalador busque un archivo llamado "myinstaller.msi" en el medio de instalación, en la misma carpeta que el msi que se está instalando. La ruta de origen anterior debe apuntar a un archivo ficticio, solo está allí para apaciguar a wix.

Editar : El siguiente ejemplo test.wxs demuestra que funciona. Produce un archivo test.msi que se instala en c: / program files / test. Tenga en cuenta que debe colocar un archivo ficticio test.msi en la misma carpeta que text.wxs para apaciguar a wix.

<?xml version=''1.0'' encoding=''utf-8''?> <Wix xmlns=''http://schemas.microsoft.com/wix/2006/wi''> <Product Name=''ProductName'' Id=''*'' Language=''1033'' Version=''0.0.1'' Manufacturer=''ManufacturerName'' > <Package Keywords=''Installer'' Description=''Installer which installs itself'' Manufacturer=''ManufactererName'' InstallerVersion=''100'' Languages=''1033'' Compressed=''yes'' SummaryCodepage=''1252''/> <Media Id=''1'' Cabinet=''test.cab'' EmbedCab=''yes''/> <Media Id=''2'' /> <Directory Id=''TARGETDIR'' Name="SourceDir"> <Directory Id=''ProgramFilesFolder''> <Directory Id=''TestFolder'' Name=''Test'' > <Component Id="InstallMyself"> <File Source="./test.msi" Compressed="no" DiskId="2" /> </Component> </Directory> </Directory> </Directory> <Feature Id=''Complete'' Display=''expand'' Level=''1'' Title=''Copy msi file to program files folder'' Description=''Test''> <ComponentRef Id="InstallMyself" /> </Feature> </Product> </Wix>