Kann eine .msi-Datei selbst (vermutlich über eine benutzerdefinierte Aktion) installieren?

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

  •  01-07-2019
  •  | 
  •  

Frage

Ich wand ein MSI zu konstruieren, die in ihrer Installation wird sich zusammen mit den darin enthaltenen Dateien / Komponenten bereitstellen, auf die TargetDir.

So MyApp.msi enthält MyApp.exe und MyAppBootstrapperEmpty.exe (ohne Ressourcen) in seiner Datei-Tabelle.

Der Benutzer startet eine MyAppBootstrapperPackaged.exe (mit MyApp.msi als Ressource, aus dem Internet irgendwo erhalten, oder E-Mail oder auf andere Weise). MyAppBootStrapperPackaged.exe extrahiert MyApp.msi in einem temporären Ordner und führt es über msiexec.exe.

Nach dem msiexec.exe-Prozess abgeschlossen ist, möchte ich MyApp.msi, MyBootstrapperEmpty.exe (AND MyApp.exe in% Programfiles% \ Ordner MeineAnw so MyApp.exe Zugriff auf MyApp.msi sichergestellt werden kann, wenn es ausgeführt wird (für die Erstellung von die unten genannten verpackten Inhalt).

MyAppBootstrapper * .exe könnte versuchen und kopieren MyApp.msi zu% Programfiles% \ MyApp-Ordner, sondern Erhebung müssen, dies zu tun, und würde für seine Entfernung über Windows Installer Deinstallation nicht zulassen, dass (aus Programme hinzufügen / entfernen oder auf andere Weise ), die erhalten werden sollen.

Offensichtlich (ich glaube, es ist offensichtlich, - bin ich falsch?) Ich nicht die MSI als Datei in meinen Medien / CAB (Huhn und Ei-Szenario) umfassen kann, so dass ich glaube, es würde über eine benutzerdefinierte Aktion durchgeführt werden muß, vor dem Prozess installieren, Hinzufügen des ursprünglichen MSI an die Medien / CAB und den entsprechenden Eintrag in der Datei Tabelle auf der Fliege MSI DB. Kann dies und wenn ja getan werden, wie?

Denken Sie an einem Content-Distribution-Modell, wo Content-Dateien sind immer nur zusammen mit der App verteilt werden. Der Inhalt wird durch die Endbenutzer über die App zur Laufzeit erzeugt und verpackt in eine verteilbare EXE, die sowohl die App und den Inhalt enthält.

MeineAnw der Installateur muss einen MSI bleiben, kann aber durch eine Bootstrapper EXE ausgeführt werden. Die installierte MyApp.exe muss Zugang zu beiden MyApp.msi haben und EXE ist „montiert“ zur Laufzeit durch die App von einer Basis (leer) MyAppBootstrapper.exe werden, die auch von der MSI installiert ist, und der Inhalt durch die erstellte Endbenutzer. Die EXE-Ressource MSI muss das gleiche sein wie die verwendet, um die App zu installieren, die die Laufzeit Verpackung tun.

WIX ist nicht mit MeineAnw installiert werden.

Es kann kein Netzwerk Abhängigkeiten zur Lauf / Verpackung- Zeit (das heißt die Verpackung über einen Webservice nicht tun - fertig lokal sein muss)

.

Ich kenne (und mit) Benutzerdefinierte Aktionen (verwaltete und nicht verwaltete, über DTF und andere).

War es hilfreich?

Lösung

Fügen Sie ein unkomprimiertes Medium dem wxs wie folgt aus:

<Media Id='2'/>

Und dann eine Komponente mit einem Datei-Elemente erstellen wie folgt:

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

Dies wird das Installationsprogramm nach einer Datei namens „myinstaller.msi“ auf dem Installationsmedium im selben Ordner wie die msi machen, das installiert wird. Der Quellpfad oben sollte auf eine Dummy-Datei verweisen, nur dort Wix zu beschwichtigen.

Bearbeiten : Der folgende Beispiel test.wxs zeigt, dass es funktioniert. Es produziert eine test.msi-Datei, die sich auf c installiert: \ program files \ test. Beachten Sie, dass Sie eine Dummy-test.msi-Datei im gleichen Ordner ablegen müssen, wie text.wxs Wix zu beschwichtigen.

<?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>

Andere Tipps

Mit einem MSI-Paket ein anderes MSI-Paket startet von „innen“ selbst genannt wird, ein verschachtelt installieren , und es ist bad juju (siehe Regel 20). Windows Installer hat einige globale Daten, die es der aktuelle installieren zu verwalten verwendet, und es behandelt nicht gut mehrere Installationen zugleich. Aus dem gleichen Grund, wenn Sie eine installieren und dann versuchen, starten eine andere zu beginnen, während der erste noch im Gange ist, werden Sie in der Regel ein Pop-up auf die Wirkung sehen „eine andere installieren läuft, bitte warten, bis es fertig ist“.

Sie können ein Programm, in der Regel ein Bootstrap-Programm genannt (ich glaube, das ist, was Sie sich beziehen), die selbst Paket nicht installieren, aber die enthalten ein Installationspaket (zB ein. MSI oder .EXE) als eine Ressource, möglicherweise komprimiert. Die Wirkung des Bootstrap-Programms ist die Ressource in eine Datei, die gemeinsam in einem %TEMP% Verzeichnis zu extrahieren / erweitern, dann entweder starten Sie die extrahierten .EXE oder MSIEXEC auf dem extrahierten MSI laufen. Das Bootstrap-Programm kann mehrere Ressourcen und Extrakt enthält + sie einzeln installieren, wenn Sie Voraussetzungen vor dem Hauptpaket zu installieren. Oder Sie können mehrere Pakete als separate Dateien gesendet und haben die Bootstrap-Programm ausführen / installieren Sie sie direkt vom Datenträger eins nach dem anderen, oder sie kopieren auf den Zielcomputer herunter und führen die Reihe der von dort installieren, oder ...

WiX selbst nicht installiert werden kann, nein. Es ist ein Werkzeug, mit dem MSI-Pakete gebaut werden kann. Das WiX Projekt hat auf seiner Wunschliste ein generisches Bootstrap-Programm, aber es wurde noch nicht umgesetzt. Es gibt auch anderen Bootstrapper erhältlich, z.B. diese .

Sie werden nicht eine benutzerdefinierte Aktion brauchen - in der Tat, da das Bootstrap-Programm ist nicht selbst ein Windows Installer-Installationspaket „benutzerdefinierte Aktion“ hat keine Bedeutung zu. Und wenn Sie vertraut genug mit CAs sind über verwaltete / unmanaged / DTF wissen, dann wissen Sie genug, um benutzerdefinierte Aktionen zu vermeiden, wann immer Sie können. (Grins)

Ich denke, es ist viel einfacher für Ihre Bootstrap MSI-Datei vordefinierten Speicherort zu extrahieren, anstatt auf den temporären Ordner. Zum Beispiel C: \ Dokumente und Einstellungen \ All Users \ Anwendungsdaten \ My Company \ My Produkt Cache installieren. Nach der Installation beendet dort MSI-Datei Sitzung verlassen Bootstrap würde. Wenn irgendwann Ihr Produkt neu zu installieren Anwender entscheidet, wird Windows Installer in der Lage Quelle MSI-Datei zu suchen.

Fügen Sie außerdem Pfad zu dieser Datei href="http://msdn.microsoft.com/en-us/library/aa371201.aspx" rel="nofollow noreferrer"> RemoveFile Tabelle so dass es wird bei der deinstallation gelöscht. Sie können für die RemoveFile Element in WiX verwenden.

Also, wenn ich verstehe, dann denke ich, ich würde die app erstellen Transformation (MST), die die Inhaltsdateien hat und dann Anwendung, wenn auf der Basis MSI. Ich bin noch nicht überzeugt, dass ich zwar verstehen. :)

Ich würde den MSI-Cache-Pfad zu einem bekannten Ort konfiguriert werden.

Dann zur Laufzeit, wenn Sie brauchen, um „Bearbeiten“ verwenden die MSI VBScript oder ähnliches.

Aber noch, ich frage, warum!?!

Ich arbeite auch auf einem Weg, um mehr MSI-Dateien bereitstellen. Ich habe ein bootstrapper.exe Programm, das die MSI-Dateien bündelt und führt sie einen nach dem anderen. Das löst mein Problem für die meisten Fälle.

Der Fall es löst nicht ist GPO (Global Policy Object) Verteilung der Installation. GPO erfordert eine Punkt-msi-Datei auszuführen ein zu installieren.

Um dies zu tun, hier ist das, was ich tue, was fast das Problem gelöst (aber nicht ganz). Ich habe die Dot-msi-Dateien in der Dateitabelle eines Installateurs und in der Binärtabelle meine Bootstrap setzen und sie von einer benutzerdefinierten Aktion nach InstallFinalize im InstallExecuteSequence eingefügt laufen. Natürlich wird das Bootstrap-Programm nicht in der Lage sein, andere MSI zu laufen, weil der Top-Level-MSI den Mutex _MSIExecute hält.

Es war ziemlich einfach, ein wenig weiter zu erhalten. Ich habe die Bootstrap Rückstellsteuerung auf der obersten Ebene Installateur und continute. Und dann hat ich einen WaitForSingleObject Aufruf für das Top-Level zu warten, bis zum Ende installieren, und das Bootstrap-Programm kann dann weiter um die Installation zu beenden.

Mein Problem ist, dass die GPO Installation beim Booten geschieht und die Top-Level-Abschluss der Installation, bevor die Unter Installateure fertig sind und GPO startet den Rechner neu.

Die Toplevel installieren gibt auch einen Erfolgsstatus, wenn die später tatsächlich nicht installieren kann.

Ich bin noch auf der Suche nach einer Möglichkeit, das Top-Level von dem Abschließen bis installieren zu blockieren, nachdem das Bootstrap-Programm abgeschlossen ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top