Starttjenester, der afhænger af side om side enheder ved hjælp af Windows Installer

Indlæg af Hanne Mølgaard Plasc

Problem



Vi er ved at opdatere opførelsen af ​​vores produkt s .msi-pakke til Windows Server 2008. Hoveddelen af ​​vores installation er et program, der køres som en Windows-tjeneste. Der er også et konfigurationsprogram, der kører under installationen at oprette registreringsposter til brug af tjenesten.


Tjenesten og konfigurationsprogrammet er afhængige af Microsoft C/C ++ runtime og MFC, som er inkluderet i .msi som fusionsmoduler. Samlingerne for C/C ++ runtime og MFC er forpligtet under InstallFinalize, hvilket synes at udelukke starten af ​​tjenesten ved hjælp af mekanismerne fra Windows Installer (er dette korrekt?) Vi ser helt sikkert side om side fejl ved at mindst konfigurationsprogrammet, hvis det køres før InstallFinalize.


Den tilgang, vi har taget, er at køre konfigurationsprogrammet som en 'begå' brugerdefineret handling efter InstallFinalize, og få denne applikation til at starte tjenesten. Dette kræver, at applikationen udføres med forhøjede privilegier (for hvilke vi bruger et manifest indeholdende en trustInfo sektion.) Dette kræver yderligere at .msi er konfigureret til at køre denne applikation uden Impersonation (som ellers konfronterer privilegium elevationen.)


Er dette en acceptabel tilgang? Hvordan er fremtidssikker det sandsynligvis at være? Er der nogen gotchas at være opmærksom på?


Det lader til, at dette er et problem, der er blevet ramt af andre:


http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg12666.html[1]


Er der en officielt (eller uofficielt) accepteret måde at håndtere sådanne problemer på?


Som et tillæg til dette er der nogen måde at sikre, at en applikation, der kører som en brugerdefineret handling under installationsprocessen, bliver fokuseret, når den starter? Applikationer, der startes på denne måde, synes altid at dukke op bag installatøren, og installationsprogrammet holder fokus, hvilket ikke er en særlig brugervenlig effekt.


Mange tak,


Bruce.

Bedste reference


Her er en løsning, jeg har brugt til denne form for problem, når der pakkes om software med Windows Installer: en 'bootstrap' launcher. Kort sagt, i stedet for at bruge fusionsmodulerne til runtime (som alle vil begå samtidig med alle dine andre installerede filer), kan du gøre et af følgende:



  1. Giv de omfordelbare MSI'er til runtime/MFC'erne, og få dem lanceret først af din bootstrapper setup.exe. Dit program s MSI skal selvfølgelig teste, at den version du har brug for er installeret og måske endda teste for at sikre, at du kører den fra din setup.exe. (Denne metode blev populariseret af InstallShield, da de kan lide at gøre slutkørslen omkring Windows Installer.)

  2. Endnu bedre kan du pakke din MSI som en forælderpakke, der installerer to (eller flere) indlejrede MSI'er: Først installer du de nødvendige runtime, så installer din software i et barn MSI. Din forældrepakke vil bekræfte, at runtime 'MSI er installeret med succes, inden du fortsætter med at installere din MSI (som har frihed til at starte tjenesterne, da forudsætningerne allerede er der).



Der er andre tricksy metoder, som din tidlige begåede tilpassede handling, men de er ikke så pålidelige som de tidstestede, jeg netop nævnte.


Håber det fornuftigt! Jeg plejede at leve og trække vejret MSI, men ikke så meget mere i disse dage ...

Andre referencer 1



  1. Du kan kompilere din statiske brug af MFC og C-Runtime, så du ikke vil blive dumpet på den.

  2. Du kan tilføje brugergrænsefladen til opsætningen, som vil fungere som konfigurationsprogrammet, så du behøver ikke at køre konfigurationsprogrammet under opsætningen (hvilket er ikke en god ide til at btw)

  3. Du kan installere tjenesten i deaktiveret tilstand og køre konfigurationen, når opsætningen er afsluttet. Konfigurationen vil være ansvarlig for at aktivere tjenesten.