Puede una .archivo msi de instalar (presumiblemente a través de una Acción Personalizada)?

StackOverflow https://stackoverflow.com/questions/88078

  •  01-07-2019
  •  | 
  •  

Pregunta

Yo varita para la construcción de un MSI que, en su proceso de instalación, se va a implementar a sí mismo junto con sus Archivos/Componentes, a la TargetDir.

Así MyApp.msi contiene MyApp.exe y MyAppBootstrapperEmpty.exe (sin recursos) en su Tabla de Archivos.

El usuario lanza una MyAppBootstrapperPackaged.exe (contiene MyApp.msi como un recurso, obtenido a partir de la en algún lugar de internet, de correo electrónico o de otra manera).MyAppBootStrapperPackaged.exe extractos MyApp.msi a una carpeta temporal y se ejecuta a través de msiexec.exe.

Después de la msiexec.exe el proceso se completa, quiero MyApp.msi, MyBootstrapperEmpty.exe (Y MyApp.exe en %ProgramFiles%\Miaplicacion carpeta para MyApp.exe puede estar seguro de acceso a MyApp.msi cuando se ejecuta (para la creación de los mencionados a continuación contenido empaquetado).

MyAppBootstrapper*.exe podría intentar copiar MyApp.msi a de %ProgramFiles%\Miaplicacion carpeta, pero necesitaría de elevación para hacerlo, y no iba a permitir que su eliminación a través de Windows Installer proceso de desinstalación (desde Agregar/Quitar Programas o de otra manera), que deben ser preservadas.

Obviamente (creo que es obvio - estoy equivocado?) Yo no puedo incluir la MSI como un archivo en mi Media/CAB (pollo y huevo escenario), así que creo que tendría que hacerse a través de una Acción Personalizada antes de que el proceso de instalación, la adición de la MSI original a la MSI DB de Media/CAB y la entrada correspondiente en la tabla de Archivos sobre la marcha.Se puede hacer esto y si es así ¿cómo?

Pensar en un modelo de distribución de contenido en el que el contenido de los archivos son solo para ser distribuido junto con la Aplicación.El contenido que se produce por el usuario final a través de la Aplicación en tiempo de ejecución, y se envasa en un distribuible EXE que incluye la Aplicación y el contenido.

MyApp el instalador debe seguir siendo un MSI, pero puede ser ejecutado por un programa Previo EXE.El instalado MyApp.exe debe tener acceso a ambos MyApp.msi a EXE y es la de ser "montado" en tiempo de ejecución mediante la Aplicación de una base (vacío) MyAppBootstrapper.exe, que también está instalado por la MSI, y el contenido creado por el usuario final.El EXE del recurso de MSI debe ser la misma que se utiliza para instalar la Aplicación que está haciendo el tiempo de ejecución de embalaje.

WIX no es para ser instalado con MyApp.

No puede haber dependencias de la red en ejecución/embalaje - tiempo (es decir,no puede hacer el embalaje a través de un Webservice - debe ser hecho localmente).

Estoy familiarizado con (y uso) de Acciones Personalizadas (administrados y no administrados, a través de la DTF y la otra).

¿Fue útil?

Solución

Añadir un sin comprimir medio de su wxs como este:

<Media Id='2'/>

Y, a continuación, crear un componente con un elemento de Archivo como este:

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

Esto hará que el instalador buscar un archivo llamado "myinstaller.msi" en el medio de instalación, en la misma carpeta que el archivo msi que está siendo instalado.La ruta de origen de arriba debe apuntar a un archivo ficticio, está allí sólo para apaciguar a wix.

Editar:La siguiente muestra de prueba.wxs demuestra que funciona.Se produce una prueba.msi archivo que se instala para c:\program files\prueba.Tenga en cuenta que usted necesita para poner un maniquí de prueba.msi archivo en la misma carpeta como texto.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>

Otros consejos

Tener uno .Paquete MSI de iniciar otra .Paquete MSI desde "dentro" de sí mismo se llama anidado instalar, y es bad juju (véase el artículo 20).Instalador de Windows tiene algunas global de datos que se utiliza para administrar la instalación de la actual, y no manejar bien varias instalaciones en el mismo tiempo.Por la misma razón, si usted comienza a instalar y, a continuación, intente iniciar otra mientras que el primero está todavía en progreso, por lo general, va a ver un pop-up para el efecto de la "otra instalación en curso, por favor espere hasta que se hace".

Usted puede tener un programa, llamado de arranque (creo que eso es lo que se está refiriendo a) que por sí misma no es un paquete de instalación, pero que contiene un paquete de instalación (por ejemplo .MSI o una .EXE) como un recurso, posiblemente comprimido.La acción de el arranque del programa es la de extraer/ampliar el recurso a un archivo, comúnmente en un %TEMP% directorio, ya sea el lanzamiento de la que se extrae .EXE o ejecutar MSIEXEC en la que se extrae .MSI.El arranque puede contener múltiples recursos y extracto+de instalar uno por uno, si usted necesita para instalar los requisitos previos antes de que el paquete principal.O usted puede enviar varios paquetes como archivos independientes, y tienen el arranque ejecutar/instalar directamente desde la distribución de los medios de comunicación, uno por uno, o copia de ellos a la máquina de destino y ejecutar la serie de instalar desde ahí, o...

WiX en sí no se instalan, no.Es una herramienta con la que .Paquetes MSI puede ser construido.El proyecto de WiX tiene en su lista de deseos un genérico de arranque de programa, pero no ha sido implementado aún.Hay otros bootstrappers disponibles, por ejemplo, este.

Usted no necesita una acción personalizada, de hecho, desde el arranque no es propio de un Instalador de Windows paquete de instalación "personalizada acción" no tiene ningún significado para él.Y, si usted está lo suficientemente familiarizado con CAs para saber sobre administrado/no administrado/DTF, entonces usted sabe lo suficiente como para evitar acciones personalizadas cada vez que puede.(sonrisa)

Yo creo que es mucho más fácil para su arranque para extraer el archivo MSI para algunos ubicación predefinida en lugar de la carpeta temp.Por ejemplo, para C:\Documents and Settings\All users\Datos de Aplicación\Mi Empresa\Mi Instalación de Productos de Caché.Después de la instalación de acabados de arranque dejaría archivo MSI sentado allí.Si en algún momento el usuario decide instalar su producto de Windows Installer será capaz de localizar la fuente de archivo MSI.

También, agregar la ruta a este archivo RemoveFile tabla por lo que se elimina en desinstalar.Puede utilizar RemoveFile elemento en WiX para que.

Así que, si me entiende, entonces creo que tendría la aplicación de crear una transformación (MST) que tiene el contenido de los archivos y que se aplican a la base de MSI.Todavía no estoy convencido de que puedo entender.:)

Me gustaría configurar el MSI caché de ruta a una ubicación conocida.

Luego en tiempo de ejecución si usted necesita a "editar" de la MSI utilizar VBScript o similar.

Pero aún así, me pregunto por QUÉ!?!

También estoy trabajando en una manera de implementar varios archivos MSI.Tengo un bootstrapper.exe programa que reúne los archivos MSI y los ejecuta de a uno por vez.Esto resuelve mi problema para la mayoría de los casos.

En el caso de no resolver es GPO (Global Policy Object) distribución de la instalación.GPO requiere un punto de msi archivo para ejecutar una instalación.

Para hacer esto aquí es lo que hizo que casi resuelto el problema (pero no toda).Pongo el punto-msi archivos en el archivo de la tabla de un instalador y poner mi arranque en la tabla binaria y ejecutarlo desde una acción personalizada se inserta después de InstallFinalize en el InstallExecuteSequence.Por supuesto, el arranque no será capaz de ejecutar otros MSI porque el nivel superior de MSI posee la exclusión mutua _MSIExecute.

Era bastante fácil de conseguir un poco más.Hice el arranque de control de retorno a la parte superior del nivel del instalador y continute.Y luego he añadido un WaitForSingleObject llamada a esperar para que el nivel superior de instalar para finalizar, y el arranque continuación, puede continuar para finalizar la instalación.

Mi problema es que el GPO de instalación que sucede en el tiempo de arranque y el nivel superior de instalar finaliza antes de que el sub instaladores y GPO se reinicia la máquina.

El nivel superior de instalar también devuelve un éxito cuando la instale en realidad puede fallar más tarde.

Todavía estoy buscando una manera de bloquear el nivel superior de instalar de completar hasta después de que el arranque completa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top