Jak zrobić MSI, który po prostu zawija plik EXE

Po zbyt wielu eksperymentach doszedłem do wniosku, że Windows Installer to po prostu zła technologia. Ale klienci chcą plików MSI.

Więc, jak mogę utworzyć plik MSI, który wyodrębnia plik EXE do katalogu tymczasowego i uruchamia go z opcjami takimi samymi lub podobnymi, jak zostały przekazane do pliku EXE?

Opcje do MSI są wyjaśnione w Msiexec (opcje wiersza poleceń) (niski poziom "uruchomienia" MSI to pakiet opcji msiexec.msi).

Edytuj: rozwiązanie WiX mjmarsh wygląda na to, że działa. Po prostu nie miałem jeszcze okazji spróbować(czas crunch). Jeśli to zadziała, zaakceptuję to.

EDIT: to nie działa. Brakujący element: nie jest dostępny.

W każdym razie, jedynym, aby to zadziałało w ogóle byłoby dla niestandardowej akcji, aby zabić proces macierzysty!

EDIT: więc ktoś wrzucił jako dalszą odpowiedź całość jako post-installową akcję niestandardową. Teoretycznie możliwe, ale ponieważ reboot może być wymagane (dzięki MS dla. Net 4 wymaga restart czasami) musimy zrobić dalsze hackery. Więc z macierzy zalet:

Transparency: No. One big custom action.
Customizability: No.
Standardization: No. 
Management and reporting: No. Appears to work but will not.
Security: No benefit.
Validation: No. The hackery required to survive reboot makes this sure to not work.
Resiliency: Completely defeated.
Rollback: No. Rollback didn't work when we were using MSI anyway.
Patching & Updates: No. We have a local solution anyway.
Logging: No. Appears to work but will not.
Nie ma sensu.
Author: Stein Åsmul, 2009-05-13

12 answers

Cóż, jest wolna droga i droga$$$. Nie mogę tu wszystkiego udokumentować, ale to powinno cię zacząć.

Na marginesie, tak, Windows Installer jest szaloną technologią. Jest wiele razy, kiedy myślę, że zadanie będzie proste, ale w rzeczywistości staje się skomplikowane. Zdecydowanie musisz się zanurzyć, aby to zrozumieć.

W każdym razie:

Darmowy: WiX (proszę.)

Jest to darmowe narzędzie do generowanie plików MSI z zestawu plików konfiguracyjnych XML. Zostawiam ci samouczki online, ale tu jest sedno:

Możesz skompresować swój EXE do instalatora za pomocą następującego tagu w pliku WXS:

<Binary Id="MYEXE" src="<path to my exe?"/>

Następnie możesz utworzyć niestandardową akcję, która uruchomi Twój plik EXE:

<CustomAction Id="EXECA_CALLMYEXE" Return="check" Execute="deferred" BinaryKey="MYEXE"
      ExeCommand="my command line"/>

Następnie wstawiasz swoją niestandardową akcję do InstallExecuteSequence w odpowiednim miejscu (prawie zawsze uruchamiam swoją gdzieś pomiędzy InstallInitialize i InstallFinalize)

<InstallExecuteSequence>
   <Custom Action="EXECA_CALLMYEXE" After="InstallInitialize"><![CDATA[Not REMOVE]]></Custom>

$$$: Get InstallShield (proszę.)

Najpierw Utwórz "podstawowy projekt MSI" i upewnij się, że mówisz, że nie chcesz żadnej konfiguracji.exe generated . Możesz to ustawić w Ustawieniach Wydania.

Następnie zasadniczo robisz to samo, co z WiX, ale masz do tego interfejs użytkownika.

  • możesz określić plik pomocniczego exe za pomocą Edytora bezpośredniego i umieścić plik EXE w' binarnej ' tabeli
  • możesz utworzyć niestandardową akcję, aby uruchomić plik EXE z w drzewie po lewej stronie znajduje się węzeł" akcje niestandardowe".]}
  • możesz wstawić niestandardową akcję, wybierając "Install Sequences" i umieszczając ją w InstallExecuteSequence gdzieś pomiędzy InstallInitialize i InstallFinalize, Jak mówiłem wcześniej.
Przepraszam, nie mogłem być bardziej szczegółowy, ale to powinien być dobry początek.
 15
Author: Mike Marshall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-17 19:09:48

Myślę, że najprostszym sposobem na stworzenie .Plik MSI ma używać WiX .

Lekcja 1 z samouczka WiX to wszystko, czego potrzebujesz, aby stworzyć prostą instalację.

 6
Author: GvS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-30 22:55:16

Joshua, bardzo dobrze rozumiem Twoją frustrację. MSI jest co najmniej dziwaczne - zupełnie nowy sposób myślenia o wdrożeniu. Mimo to prawidłowo zastosowana MSI oferuje najlepsze możliwe wdrożenie, szczególnie dla klientów korporacyjnych.

Jakie operacje wykonuje Twój instalator EXE? Czy jest to w dużej mierze kopia pliku, trochę rejestracji COM i niektórych zapisów rejestru, czy też uruchamia skomplikowaną logikę instalacji, konfigurowanie baz danych itp...? Pytam, bo prawdopodobnie byłoby to bardzo szybko stworzyć dobrze funkcjonujący WIX MSI dla Ciebie, abyś mógł zrezygnować z podejścia EXE.

Jest rzeczywiście możliwe uruchomienie EXE z wnętrza MSI, ale wymaga to odpowiedniego sekwencjonowania i gwarantuje, że spowoduje to więcej bluesa niż zwykły MSI. Jeśli aplikacja jest mała i nie robi nic szalonego podczas instalacji, byłbym szczęśliwy, aby zapewnić Ci podstawową konwersję WIX.

 4
Author: Stein Åsmul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:15

Brak rozwiązania. Udaliśmy się na NSIS, ponieważ korporacyjna instalacja MSI i tak będzie zepsuta z powodu problemu z zagnieżdżeniem MSI (po prostu spróbuj zainstalować exe owijając MSI z wewnątrz MSI pewnego dnia).

 2
Author: Joshua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-03 19:47:50

Istnieje również darmowa wersja wrappera MSI . Obsługuje również odinstalowywanie i aktualizacje. Ponadto tworzy tylko jeden wpis w Dodaj lub usuń programy.

 2
Author: J. Rasmussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-17 19:45:33

Dodając do weir's ODPOWIEDŹ, Zmień custom action attribute Jak poniżej:

<!--Run Action-->
    <CustomAction Id="RunWrappedExe"
                  Return="asyncNoWait"
                  FileKey="ApplicationFileId"
                  Execute="deferred"
                  ExeCommand=""
                  HideTarget="no"
                  Impersonate="yes"/>

Ustawienie Return=asyncNoWai nie czeka na powrót exe. Instalator wykonuje swoje zadanie i zamyka się normalnie. Tymczasem exe kontynuuje jego wykonywanie.

-Madhuresh

 2
Author: now he who must not be named.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-23 09:45:41

Spróbuj tego:

W pakiecie MSI jest wywołanie zachowania "Uruchom aplikację po instalacji", co oznacza, że plik exe zostanie wykonany po instalacji MSI (MSI jest zamknięty).

Spróbuj tam uruchomić swój exe, więc gdy twój exe wywoła inne pakiety MSI, nie będzie to sprzeczne z pierwszym.

 1
Author: James Yang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-21 00:24:43

Wix może to zrobić. Oto mój przykładowy kod do wix 3.5:

<?xml version='1.0'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
   <Product Id='*' UpgradeCode="11111111-2222-3333-4444-555555555555" 
        Name='My Setup' Language='1033' Version='1.0.0.0' 
        Manufacturer='Your company'>

    <Package Description='pak' InstallerVersion='200' Compressed='yes' />

    <Media Id='1' Cabinet='setup.cab' EmbedCab='yes' />

    <Directory Id='TARGETDIR' Name='SourceDir'>
        <Directory Id="TempFolder">
            <Directory Id="INSTALLLOCATION" Name="~_tmpdir">
                <Component Id='MyComponent' DiskId='1' Guid=''>
                    <File Id="File0" Name="setup.exe" Source="setup.exe" />
                    <File Id="File1" Name="file1.txt" Source="file1.txt" />
                </Component>
            </Directory>
        </Directory>
    </Directory>

    <Feature Id='InstallFeature' Title='Install Feature' Level='1'>
        <ComponentRef Id='MyComponent' />
    </Feature>

    <!-- Run Action -->
    <CustomAction Id="RunWrapExe" Return="ignore" Execute="deferred" 
                  FileKey="File0" ExeCommand="setup.exe param here"  
                  HideTarget="no" Impersonate="no" />

    <InstallExecuteSequence>
        <Custom Action="RunWrapExe" 
                After="InstallFiles">NOT REMOVE~="ALL"</Custom>
    </InstallExecuteSequence>

   </Product>
</Wix>
 1
Author: weir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-28 11:56:43

Jeśli nie chcesz zarządzać MSI, a tylko wykonywać EXE, spróbuj exe to msi Converter Free. Wystarczy wejść na ścieżkę do EXE i dostać MSI.

 0
Author: pawelek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 15:46:04

Miałem ten sam problem (zawijanie EXE, wywoływanie innych MSI z EXE włącznie z konfiguracją. NET itp.), a oto moje rozwiązanie:

Buduję setup exe używając InstallAware. Posiada własny Wrapper MSI, który owija wygenerowany EXE za pomocą MSI.

To działa OK, EXE może wywoływać inne MSI bez żadnego problemu (w tym. Net setup, Inne konfiguracje innych firm), ale to dlatego, że uruchomienie MSI kończy się ("zwraca") prawa po uruchomieniu pliku exe setup, i w ten sposób unikają MSI ograniczenie rekurencyjnych wywołań MSI.

Ale-niektórzy klienci (firmy), którzy używają narzędzi do wdrażania MSI, wymagają, aby MSI (msiexec) wrócił (Koniec) dopiero po zakończeniu procesu konfiguracji, i to jest problem z powyższym rozwiązaniem.

Więc-aby rozwiązać ten problem:

Jest kolejny Wrapper MSI (exemsi.com), który generuje MSI, który powraca dopiero po zakończeniu konfiguracji EXE, ale aby go użyć, musisz użyć innej unikalnej opcji InstallAware:

InstallAware ma opcję aby wygenerować konfigurację EXE przy użyciu własnego silnika natywnego, a nie opartego na silniku Instalatora Windows, aby uniknąć ograniczenia rekurencyjnego MSI. Połącz oba te elementy, a otrzymasz idealne rozwiązanie.

Mam nadzieję, że to komuś pomoże, chociaż minęło wiele lat od pierwszego opublikowania tego pytania.

 0
Author: Oren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-27 10:57:40

Prosta sztuczka:

Projekt image

using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;

namespace Setup
{
    internal class Program
    {
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        private static void Main(string[] args)
        {
            ShowWindow(GetConsoleWindow(), 0);
            Stream st = Assembly.GetExecutingAssembly().GetManifestResourceStream("Setup.MSI.Temp.msi");
            string path = Path.Combine(System.IO.Path.GetTempPath(), "Temp.msi");
            using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
            {
                st.CopyTo(fileStream);
            }
            Process p = new Process();
            p.StartInfo.FileName = path;
            p.Start();
            p.WaitForExit();
            File.Delete(path);
        }
    }
}
 -1
Author: user2684935,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-13 07:25:27

Nie, po prostu Użyj kreatora Inno Setup. Tworzy setup EXE, ale nie MSI. To jakieś 5 minut i będziesz miał Instalator windows.

Po prostu Pobierz , Zainstaluj, wskaż swój EXE i postępuj zgodnie z instrukcjami wyświetlanymi na ekranie

 -2
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-29 23:31:44