7 Replies Latest reply on Feb 26, 2013 7:44 AM by derniwi

    ExitProc(Ex)(Undone), Service-/Auto-Installer und erneut Installieren

    derniwi Master
      Hallo,

      habe mal wieder ein mehr oder weniger großes Problem.
      Ich möchte in einem Paket eine erneute Installation ermöglichen. Es sollen benutzer- und computerabhängige Daten verteilt werden. Weiterhin ist es notwendig, das Programm zu Deinstallieren und erneut zu installieren. Und genau dazwischen kann ein Neustart notwendig sein.

      Dabei gibt es ein paar Probleme, denen ich auf den Grund gehen möchte. Ich konnte das jetzt mal in einem kleinen Skript nachstellen:
      Set('Mode','Installation')
      If CheckInstallMode(imReinstall)
      Set('Mode','Neu installieren')
      Else
      If CheckInstallMode(imAppRepair)
        Set('Mode','Reparatur')
      Else
        If CheckInstallMode(imUninstall)
         Set('Mode','Deinstallation')
      !  
      Set('reboot','')
      MsgBoxEx('Installmode: %Mode%Reboot?','reboot','',mbYesNo,'','')
      If %reboot%='YES'
      System_Reset/?
      !
      Set('exit','')
      MsgBoxEx('Exit unDone?','exit','',mbYesNo,'','')
      If %exit%='YES'
      ExitProcEx(Undone,'Reboot: %reboot%, Mode: %Mode% (%time%)')
      !
      : $BeginUninstallScript
      Set('Mode','Installation')
      If CheckInstallMode(imReinstall)
      Set('Mode','Neu installieren')
      Else
      If CheckInstallMode(imAppRepair)
        Set('Mode','Reparatur')
      Else
        If CheckInstallMode(imUninstall)
         Set('Mode','Deinstallation')
      !  
      Set('reboot','')
      MsgBoxEx('Installmode: %Mode%Reboot?','reboot','',mbYesNo,'','')
      If %reboot%='YES'
      System_Reset/?
      !
      Set('exit','')
      MsgBoxEx('Exit unDone?','exit','',mbYesNo,'','')
      If %exit%='YES'
      ExitProcEx(Undone,'Reboot: %reboot%, Mode: %Mode% (%time%)')


      Wird das Skript über den Shop gestartet, dann kann man auswählen, ob man den Rechner neu starten möchte und ob das Skript mit "Undone" beendet wird. Bei der Installation braucht man das jetzt nicht... Wenn ich den Shop neu starte und das Paket neu installiere und dabei auswähle, dass nicht neu gestartet, aber mit "Undone" beendet wird, geht die Policy dennoch auf Grün.

      Im NI32*.log finde ich folgendes:
      15:19:09.349 1      -------- >>> Executing project db:master\TestPackage --------------------------
      15:19:09.349 1       [ExecFlags: 0x010001 (asf, ri)]
      15:19:09.349 0       Checking install state of {B404791B-0483-4ED9-AF27-634A7DA1D423}...
      ...
      15:19:09.380 1       Pre execution analysis of install state... [ExecFlags: 0x010001 (asf, ri)]
      15:19:09.380 2        Reinstalling workstation and user part of the application.
      15:19:09.380 1       Installmode: [ExecFlags: 0x016010 (install, ri, ws, usr)]
      ...
      15:19:09.677 2        ---->Starting installation of "TestPackage"

      15:19:09.693 2        -> Set('Mode','Installation')

      15:19:09.709 1        Evaluating condition "CheckInstallMode(imReinstall)"
      15:19:09.709 2        Condition TRUE  -> entering IF part

      15:19:09.724 2        ->  Set('Mode','Neu installieren')
      15:19:09.724 2        else - Skipping ELSE part
      15:19:09.724 2        Skipping command : If
      15:19:09.740 2        Skipping command : Set
      15:19:09.740 2        Skipping command : Else
      15:19:09.740 2        Skipping command : If
      15:19:09.756 2        Skipping command : Set

      15:19:09.756 2        -> Set('reboot','')

      15:19:09.771 2        -> MsgBoxEx('Installmode: Neu installierenReboot?','reboot','',mbYesNo,'','')

      15:19:12.647 1        Evaluating condition "_reboot_='YES'"
      15:19:12.647 0         Comparing 'NO' with 'YES'
      15:19:12.647 2        Condition FALSE  -> skipping IF part
      15:19:12.663 2        Skipping command : System_Reset

      15:19:12.663 2        -> Set('exit','')

      15:19:12.678 2        -> MsgBoxEx('Exit unDone?','exit','',mbYesNo,'','')

      15:19:16.023 1        Evaluating condition "_exit_='YES'"
      15:19:16.023 0         Comparing 'YES' with 'YES'
      15:19:16.054 2        Condition TRUE  -> entering IF part

      15:19:16.070 2        ->  ExitProcEx(Undone,'Reboot, Mode: Neu installieren (15:19:16)')
      15:19:16.070 2         ER: Creating event manager
      15:19:16.070 1         ER: file name is C:\Program Files (x86)\NetInst\ExR\Event.erl
      15:19:16.086 1         ER: user name is niwitest
      15:19:16.086 1        Logging up ExR event 3003 (0x00000bbb)
      15:19:16.133 1        Logging up ExR event 3003 (0x00000bbb)
      15:19:16.148 0        Check if sending data is on: ExrClientOptions.ExrSendingActivated

      15:19:16.164 1        ExR is allowed to send data.
      15:19:16.179 1        Loading SI.dll ...

      15:19:16.195 1        SI: Starting ExRSend.exe ...
      15:19:16.211 2        SI: Rewriting SI client state data...
      15:19:16.226 1         SI: Reading client state...
      15:19:16.226 0         SI: Getting IP addresses...
      15:19:16.242 0         SI: Getting MAC addresses...
      15:19:16.258 1         SI: Writing possible changes of client state...
      15:19:16.320 0        nilsPipe: Both current project and new project are NULL
      15:19:16.320 2        xniFPS: '{B404791B-0483-4ED9-AF27-634A7DA1D423}' is installed

      15:19:16.336 2        ---->Installation of TestPackage has not completed on exit.
      15:19:16.336 1      > Action 'Executing project db:master\TestPackage [ExecFlags: 0x010001 (asf, ri)]' failed (Action took 7000 ms.)


      Und im NIAI32*.log steht folgendes:
      15:20:26.234 1    SWMSRT: -------- Processing PolicyInstance POLICYINSTANCE.16817 -----------------------
      15:20:26.249 1    SWMSRT: TARGET[COMPUTER.6461]: POLICYINSTANCE[POLICYINSTANCE.16817]->POLICY[SWPOLICY.5409]->PACKAGE[ESCRIPTPACKAGE.6510(TestPackage)]
      15:20:26.249 1     SWMSRT: ExecutionMode is 'Install', ClientRolloutState is 'Pending', InstallationState is 'Installed'
      ...
      15:20:26.374 2     SWMSRT: Start handle the PolicyInstance POLICYINSTANCE.16817
      15:20:26.390 0      SwmsTpExtenderScript: Handle the eScript PolicyInstance POLICYINSTANCE.16817
      15:20:26.406 0       SWMSRT: Entering pilot installation mode
      15:20:26.406 0       siClnt32: Installation state of package {B404791B-0483-4ED9-AF27-634A7DA1D423} (workstation part): Installed:  06.2.2013 15:10, Version: 2, State: (2) completely installed, Count: 1, Context: DSM2, GUID:
      15:20:26.421 0       siClnt32: Installation state of package {B404791B-0483-4ED9-AF27-634A7DA1D423} (       user part): Installed:  06.2.2013 15:10, Version: 2, State: (2) completely installed, Count: 1, Context: DSM2, GUID:
      ...

      15:20:26.656 1  ================================================================================
      15:20:26.671 1  -------- AUTOINSTALL RUN #0 ----------------------------------------------------
      15:20:26.671 1  ================================================================================
      15:20:26.687 1   JOB:POLICYINSTANCE.16817 TestPackage ( ExecFlags: [ExecFlags: 0x000010 (install)] )

      15:20:26.703 2   Run Job (1 of 1) JOB:POLICYINSTANCE.16817 (TestPackage) [ExecFlags: 0x000010 (install)]
      15:20:26.718 2   Minimize autoinstaller window: 'no'
      15:20:26.734 2   Checking Prerequisites of Job JOB:POLICYINSTANCE.16817...
      15:20:26.749 0    SWMSRT: Checking MultiAssignment for PolicyInstance POLICYINSTANCE.16817 at ClientObject COMPUTER.6461
      15:20:26.765 2    Minimize autoinstaller window: 'no'
      15:20:26.765 0      SWMSClntLib: Getting assigned PolicyInstances with ClientRolloutState Implemented
      15:20:26.796 0       SWMSClntLib: Getting all assigned PolicyInstances
      15:20:26.796 0      SWMSClntLib: Got 56 PolicyInstances with matching ClientRolloutState Implemented
      15:20:26.812 0    siClnt32: Installation state of package {B404791B-0483-4ED9-AF27-634A7DA1D423} (workstation part): Installed:  06.2.2013 15:10, Version: 2, State: (2) completely installed, Count: 1, Context: DSM2, GUID:
      15:20:26.828 0    siClnt32: Installation state of package {B404791B-0483-4ED9-AF27-634A7DA1D423} (       user part): Installed:  06.2.2013 15:10, Version: 2, State: (2) completely installed, Count: 1, Context: DSM2, GUID:
      15:20:26.828 0    SWMSRT: Passed MultiAssignmentCheck: No other Assignments found

      15:20:26.843 1    SWMSClntLib: -------- Read installation parameters from registry ---------------------------
      15:20:26.890 1    SWMSClntLib: Open the package with guid: {B404791B-0483-4ED9-AF27-634A7DA1D423}
      15:20:26.890 2    SWMSRT: The package is already installed nothing todo.
      15:20:26.921 0    SWMSClntLib: Trying to set State for PolicyInstance 16817:
      15:20:26.921 0     SWMSClntLib: ExecutionMode: 0
      15:20:26.937 0     SWMSClntLib: InstallationState: 2
      15:20:26.937 0     SWMSClntLib: InstallationState for PolicyInstance 16817 set successfully
      15:20:26.953 0     SWMSClntLib: Setting ClientRolloutState to Implemented
      15:20:26.968 0     SWMSClntLib: ClientRolloutState for PolicyInstance 16817 set successfully
      15:20:26.999 2    Run of Job JOB:POLICYINSTANCE.16817 is not needed...


      Also, während der Service-Installer noch von ReInstall spricht, weiß der Auto-Installer danach nichts mehr davon, und bearbeitet das Skript als normale Installation. Diese führt er aber nicht durch, weil er der Meinung ist, maschinenbezogene und benutzerbezogene Teile wären ja schon installiert.

      Ist das ein Bug?
      Wenn nicht, wie kann ich das am Besten umgehen?

      Das "echte" Paket (oben ist ja nur ein Beispiel) darf im Kontext des Benutzers und des Services ausgeführt werden, da ich ja beide Teile brauche. Über ExitProc(Undone) würde ich eigentlich steuern, dass noch etwas zu tun ist und über einen Marker in der Registry die Stelle merken, so dass ich da wieder weitermachen könnte. Aber dazu kommt es ja nicht, der Marker wird zwar gesetzt, aber eine erneute Ausführung geschieht ja leider nicht.

      Gruß
      Nils
        • 1. Re: ExitProc(Ex)(Undone), Service-/Auto-Installer und erneut Installieren
          NicoS1 Master
          Hallo Nils,

          ich denke der Hund liegt ganz wo anders begraben. Hier kollidiert das ganze etwas mit dem Policy System.

          So wie ich das sehe bekommt der Server bzw. die Policyinstanz es gar nicht mit, wenn du über den Shop etwas neuinstallierst. Die Policy bleibt zu jeder Zeit grün. Die Neuinstallation wird rein lokal abgehandelt (außer eventueller Download der Paketdateien).

          Sprich, du kannst aus dem Paket heraus die Policy Instanz des Paketes nicht mehr von Grün auf Gelb umstellen. Dein Script würde warscheinlich nur sauber laufen, wenn du das Paket aus der Konsole heraus auf neuinstallieren setzt, dann bekommt es auch der Autoinstaller mit und läuft im Reinstall Modus.

          ---

          Ich würde aber mal etwas ganz anderes Probieren... ist vielleicht etwas "krank" und DSM verar... aber ich könnte mir vorstellen dass das funktioniert

          Wenn der User beim Reboot Ja auswählt, dann setze irgendwo in der Registy einen Key, den du später wieder abfragen kannst.

          Danach machst du 2x RegUnLoad Key, einmal Userbezogen einmal Computerbezogen auf:

          HKEY_CURRENT_USER\Software\NetSupport\NetInstall\Installed Apps\UniqueID

          HKEY_LOCAL_MACHINE\Software\NetSupport\NetInstall\Installed Apps\UniqueID

          Die Unique ID ist jeweils das was du in den Paketeigenschaften siehst, ein langer Wert in geschweiften Klammern.

          Jetzt kannst du deinen Exitproc(undone) und Reboot machen.

          ----------

          Wenn jetzt der AutoInstaller anläuft erkennt er trotz grüner Policy, das auf dem Rechner der User und der Computerteil fehlt, und legt im normalen Install Modus los das Teil zu installieren. Jetzt kommt dein vorhin gesetzter Registry Key in Spiel den du abfragen kannst und dann entsprechend deine Aktionen ausführen kannst.

          Der Haken liegt jetzt noch beim Exitproc... ich hoffe stark, dass er mit dem Exitproc(undone) nicht her geht und die Registy Werte die wir gelöscht haben nicht wieder schreibt. Da weiß ich leider nicht wie er reagiert.

          Viel Spaß und Erfolg beim ausprobieren. Würde mich freuen wenn du nochmal meldest obs geklappt hat.

          Alle Angaben ohne Gewähr

          Gruß
          • 2. Re: ExitProc(Ex)(Undone), Service-/Auto-Installer und erneut Installieren
            derniwi Master
            Hallo Nico,

            das Paket wird kurz gelb: in der Zeit, wenn ich den Shop und somit den (wie heißt der denn eigentlich) Installer beende, bis der Auto-Installer läuft.

            Ich habe das Paket mal umgestellt, so dass es nur im Benutzerkontext läuft, aber auch hier ist der Wechsel von Installer zu Auto-Installer das Problem.

            Der Reboot ist gar nicht notwendig, um dieses "Problem" zu bekommen. Letztlich bedeutet das aber, dass im Shop ein ExitProc(Undone) doch gar nicht verwendet werden kann.

            Ich glaube, ich frage diesbzgl. mal bei FrontRange nach...

            Hat noch jemand DSM auf einer Version kleiner 7.2 und könnte mal schauen, wie diese Geschichte dort funktioniert?

            Danke und Gruß
            Nils
            • 3. Re: ExitProc(Ex)(Undone), Service-/Auto-Installer und erneut Installieren
              NicoS1 Master
              Hallo Nils,

              ich hab bei mir mal ein kleines Paket gemacht mit einer MessageBox und Exitproc undone. Bei mir (7.0 mit aktuellstem Patch) wird das Paket zu keiner Zeit gelb in der Konsole.

              Zu den Installern kurz:
              Autoinstaller - Wird durch Niagnt32.exe gestartet, NIAI32... log, läuft nur wenn User angemeldet ist. Statusfenster kann angezeigt werden.
              Serviceinstaller - Wird durch Dienst angestartet, läuft nicht im Userkontext, macht keine Userbezogene Sachen... NISRV32...log. Kein Statusfenster
              Software Shop - Gleicher Kontext wie Autoinstaller NI32...log.

              "Nur wenn Benutzer angemeldet ist" bedeutet so viel wie, dass das Paket nur mit dem Autoinstaller oder Shop ausgeführt werden kann, nicht mit dem Serviceinstaller.

              Gerade bei Paketen mit Userabfragen wie Messageboxen war der Serviceinstaller immer arg unglücklich. Beispiel, eine Messagebox für den User, danach ein Execute. Der AI hat die Messagebox schön angezeigt, danach den execute gemacht. Kam der Serviceinstaller, hat er die Box übersprungen, direkt den Execute gemacht und wenn der AI irgendwann los lief kam dann die Box für den User, danach aber nicht mehr der Execute, da den der Serviceinstaller schon gemacht hat.

              Und da jedesmal drum herum zu scripten ist blöd, weshalb bei uns fast alle Pakete auf "nur wenn benutzer angemeldet ist" stehen.

              Aber in der 7.2 gibts hier ja Änderungen.
              • 4. Re: ExitProc(Ex)(Undone), Service-/Auto-Installer und erneut Installieren
                derniwi Master
                Hallo,

                habe jetzt eine Antwort vom Support bekommen:
                Resolution:
                ******** Behavior is not a product failure. Please use the option "Failed" instead of "Undone" to mark an installation as failed. Please use the enteo forum for packaging questions or contact professional service for onsite assistance.

                Das heißt, wenn ich über den Shop ein Paket verteile, während der Installation ein Neustart erforderlich ist und ich an der Stelle ExitProc(Undone) verwenden möchte, um beim nächsten Start dort das Skript weiter laufen soll, wird das nicht funktionieren.

                Wie macht ihr das?

                Gruß
                Nils
                • 5. Re: ExitProc(Ex)(Undone), Service-/Auto-Installer und erneut Installieren
                  _Mel_ Master
                  also mal ganz einfach gesagt: wenn die ausführung eines paketes sich im shop anders verhält als im autoinstaller, dann ist das sicher nicht gewollt.
                  ...es könnte aber technische gründe haben, wie z.B. daß der shop den executionmode nicht umstellen kann und damit einem später laufenden installer die info, daß es ein reinstall ist, nicht zukommen lassen kann.

                  aber ich würde erwarten, daß der workaround mit dem löschen der registryeinträge funktioniert.
                  • 6. Re: ExitProc(Ex)(Undone), Service-/Auto-Installer und erneut Installieren
                    NicoS1 Master
                    Hallo Nils, einen möglichen Lösungsweg habe ich dir ja schon gepostet...
                    • 7. Re: ExitProc(Ex)(Undone), Service-/Auto-Installer und erneut Installieren
                      derniwi Master
                      @Nico:
                      Ich habe das mal probiert und die beiden Schlüssel in der Registry rausgeworfen. Damit geht das dann schon etwas besser, aber leider fehlt DSM dann jede Information, dass eine Neuinstallation bzw. eine Reparatur angefragt war.

                      Im nächsten Schritt muss ich den Installationsmodus auswerten und in der Registry vermerken und später auswerten.

                      Und zum Abschluss habe ich mal geschaut, was da so eigentlich notwendig wäre. Wenn ich den Wert "InstallState" von 2 auf 1 ändere, dann sollte das eigentlich helfen. Aber das reicht an dieser Stelle nicht, ich muss auch noch die Version neu setzen.

                      Das Ganze sieht jetzt so aus:
                      Set('Mode','Installation')
                      Set('myMode','0')
                      If RegValueExists('HKEY_LOCAL_MACHINE\Software\NetSupport\NetInstall\Installed Apps\%CurrentPackage.Object.UniqueId%','myMode')
                      RegReadValue('HKEY_LOCAL_MACHINE\Software\NetSupport\NetInstall\Installed Apps\%CurrentPackage.Object.UniqueId%','myMode','myMode')
                      RegDeleteKey('HKEY_LOCAL_MACHINE\Software\NetSupport\NetInstall\Installed Apps\%CurrentPackage.Object.UniqueId%','myMode',)/TS
                      !
                      If CheckInstallMode(imReinstall) or %myMode%='1'
                      Set('Mode','Neu installieren')
                      Set('myMode','1')
                      Else
                      If CheckInstallMode(imAppRepair) or %myMode%='2'
                        Set('Mode','Reparatur')
                        Set('myMode','2')
                      Else
                        If CheckInstallMode(imUninstall)
                      !   dieser Befehl wird nie funktionieren
                         Set('Mode','Deinstallation')
                      !
                      Set('exit','')
                      MsgBoxEx('Exit unDone?','exit','',mbYesNo,'','')
                      If %exit%='YES'
                      RegModifyDWord('HKEY_LOCAL_MACHINE\Software\NetSupport\NetInstall\Installed Apps\%CurrentPackage.Object.UniqueId%','InstallState','1',mrdwSet)/TW
                      RegModifyDWord('HKEY_LOCAL_MACHINE\Software\NetSupport\NetInstall\Installed Apps\%CurrentPackage.Object.UniqueId%','Version','0',mrdwSet)/TW
                      RegModifyDWord('HKEY_LOCAL_MACHINE\Software\NetSupport\NetInstall\Installed Apps\%CurrentPackage.Object.UniqueId%','myMode','%myMode%',mrdwSet)/TW
                      ExitProcEx(Undone,'Exit(Undone), Mode: %Mode% (%time%)')


                      Wie gesagt, das ist ein kleines Test-Paket ohne wirkliche Funktion. Ich habe mit einem Programm das Problem bekommen, dass bei einer Neuinstallation / Reparatur ein Neustart erforderlich war. Nach dem Neustart wäre aber noch etwas zu tun gewesen, was dann nicht mehr geschehen ist. Die Abfrage durch die MessageBox wäre eigentlich der Programmaufruf und die Auswertung des Rückgabewerts, bei MSI's wäre hier dann ein 3010 gemeldet worden.

                      Ganz glücklich bin ich mit dieser Methode noch nicht und überlege, ob ich im Problemfall nicht lieber mit Exit(Failed) beende... das hilft dem Benutzer zwar auch nicht, aber ich sehe, wo das Problem auftritt und kann evtl. besser eingreifen.

                      Leider ist meine Erkenntnis: Software-Shop, Neuinstallation oder Reboot und im Paket weitermachen geht einfach nicht vernünftig. Ohne den Shop hingegen scheint das kein Problem darzustellen...