4 Replies Latest reply on Apr 19, 2018 12:20 AM by derniwi

    Wieder mal "automatische Deinstallation" von Paketen

    olliko Apprentice

      Hallo, das automatische invertieren des Installationsscripts funktioniert ja bei den meisten unserer Pakete gut. Jetzt muss ich aber ein Paket bauen, das mit der automatischen Invertierung nicht funktioniert - einfach wegen der Reihenfolge.

       

      Ich habe das jetzt versucht mit einem

       

      If CheckInstallMode(imUninstall)

            goto $EndInstall

       

      das erzeugt folgenden Eintrag im Log

       

      13:06:27.034 2   ---->Starting uninstallation of "DMS Enaio 8.5 Basis MSI Install"

       

      13:06:27.045 1   Evaluating condition "CheckInstallMode(imUninstall)"
      13:06:27.045 2   Condition TRUE-> entering IF part

       

      13:06:27.046 2   ->  goto $EndInstall
      13:06:27.046 0    Uninstall of goto not supported

       

      13:06:27.048 1   Evaluating condition "CheckInstallMode(imWkStaPart)"
      13:06:27.048 2   Condition TRUE-> entering IF part

       

      13:06:27.050 2   ->  MSIInstallProduct('C:\Program Files (x86)\Common Files\enteo\RepositoryCache\47296\rev\1\Extern$\ClientMSI\DISK1\enaio client-Installation.msi','DEBUG',MsiInstMach) ... /TS
      13:06:27.051 0    xniMSI: Loading C:\Windows\SysWOW64\msi.dll (Version 5.0.16299.15)
      13:06:27.063 1    xniMSI: Status verification of C:\Program Files (x86)\Common Files\enteo\RepositoryCache\47296\rev\1\Extern$\ClientMSI\DISK1\enaio client-Installation.msi...
      13:06:27.066 1     xniMSI: Package verified OK.
      13:06:27.067 0     xniMSI: Package found at sourcepath
      13:06:27.067 0     xniMSI: Reading packageinformations
      13:06:27.128 2     xniMSI: Product info: enaio client-Installation 8.50.0000
      13:06:27.128 2     xniMSI: Product GUID: {3B2BEC58-74F2-4855-A82C-B1097E5A826B}
      13:06:27.132 2     xniMSI: Current install state: INSTALLSTATE_DEFAULT
      13:06:27.143 0    xniMSI: MSI log file will be written to C:\Program Files (x86)\Common Files\enteo\NiLogs\MSI\NiMsiUnst1524049587[enaio client-Installation].log
      13:06:27.144 1    xniMSI: MSI logging enabled. LogLevel is NORMAL (0x00001bc7). LogFile is C:\Program Files (x86)\Common Files\enteo\NiLogs\MSI\NiMsiUnst1524049587[enaio client-Installation].log
      13:06:27.144 0     xniMSI: Uninstalling product code: {3B2BEC58-74F2-4855-A82C-B1097E5A826B}

       

      13:07:18.114 2   ->  MSIApplyPatch('C:\Program Files (x86)\Common Files\enteo\RepositoryCache\47296\rev\1\Extern$\ClientMSI\Patch850.msp',MsiInstMach,'')/TS
      13:07:18.114 1    xniMSI: Uninstallation of MSIApplyPatch not supported dropping command.

      Ich versteh nicht:

       

      1. Warum wird das Goto nicht einfach ausgeführt? Ein Goto zu invertieren ist relativ sinnlos....
      2. Wie der "CheckInstallMode(imUninstall)" zeigt befinden wir uns ja im UnInstallMode. Warum läuft DSM dann trotzdem in den if-Teil des "CheckInstallMode(imWkStaPart)". Sind beide zustände gleichzeitig wahr? imWkStaPart heisst für mich, "installieren, nur Maschinenteile".
      3. Wie kann ich das Skript dazu veranlassen, die Installationsbefehle NICHT zu invertieren, sondern nur die Deinstallationsbefehle nach :BeginUninstallScript auszuführen?

       

      Gruss, Oliver

       

      Der vollständigkeit halber hier nochmal das ganze Script

       

      If CheckInstallMode(imUninstall)

      goto $EndInstall

      !

      If CheckInstallMode(imWkStaPart)

      MSIInstallProduct('.\Extern$\ClientMSI\DISK1\enaio client-Installation.msi','DEBUG',MsiInstMach)

       

        params:ADDLOCAL=Client,OSPrinter,PDFPrinter

      EndProc/TS

      MSIApplyPatch('.\Extern$\ClientMSI\Patch850.msp',MsiInstMach,'')/TS

      !   -

      ! ax.exe im Adminmodus starten, um restliche DLLs zu registrieren

      RunAsEx('C:\Program Files (x86)\OPTIMAL SYSTEMS\OSECM\clients\client32\ax.exe','-i','%h','k2EE817EF5E847F3388G0A','','_return',raUseSisAccount+raHideWindow+Done)/TS

      Sleep('30')

      KillProcess('ax.exe',kpKillOnUninstall+kpKillChildrenToo+kpByFileName+kpKillAll)/TS

      !

      ! Zur Sicherheit regsvrutil ausführen

      ExecuteEx('C:\Program Files (x86)\OPTIMAL SYSTEMS\OSECM\clients\client32\regsvrutil.exe /s ','_return','')/?/TS

      Sleep('60')

      !

      ! Outlook AddIn installieren

      MSIInstallProduct('.\Extern$\enaio_outlook_addin_ng\enaio_Outlook_addin_setup.msi','DEBUG',MsiInstMach)

       

        params:

      EndProc/TS

      ! MS Office AddIn installieren

      MSIInstallProduct('.\Extern$\enaio_office_addin_ng\enaio_Office_addin.msi','DEBUG',MsiInstMach)

       

        params:

      EndProc/TS

      !

      ! Startmenü-Links löschen

      Delete('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\ENAIO\*.*')/S/F/TS

      RemoveDir('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\ENAIO')/S/TS

      ExitProcEx(Done,'Enaio Basispaket installiert')

      !

      : $EndInstall

      !

      !Start Deinstallation

      : $BeginUninstallScript

      If CheckInstallMode(imUninstall)

      ! MS Office und Outlook-AddIn deinstallieren

      MSIUnInstallProduct('{147452B9-0921-435B-848B-1599A6422E19}','enaio Outlook addin 8.50.0.21')/TS

      MSIUnInstallProduct('{62AE0203-3AF2-4997-BC52-609E578CE5F3}','enaio Office Add-In 8.50.6610.26579')/TS

      !

      ! Patch deinstallieren

      ExecuteEx('msiexec.exe /I {3B2BEC58-74F2-4855-A82C-B1097E5A826B} MSIPATCHREMOVE={A140CAAD-E1F0-4A24-99C9-F8020819F5F7} /qb /norestart','_return','5')/?/TS

      ! -

      ! MSI deinstallieren

      MSIUnInstallProductEx('{3B2BEC58-74F2-4855-A82C-B1097E5A826B}','enaio client-Installation 8.50.0000','ADDLOCAL=Client','1','0')/TS

      ! -

      ! Aufräumen

      Delete('C:\Program Files (x86)\OPTIMAL SYSTEMS')/S/F/TS

      RegDeleteKey('HKEY_LOCAL_MACHINE\SOFTWARE\OPTIMAL SYSTEMS','',)/TS

      ExitProcEx(Done,'Enaio Basispaket deinstalliert')

        • 1. Re: Wieder mal "automatische Deinstallation" von Paketen
          derniwi Master

          Hallo Oliver,

           

          naja, das automatische Deinstallieren invertiert nur manche Befehle - alle sind natürlich nicht möglich. Diese Funktion ist auch nur bei einiges wenigen Paketen sinnvoll - meiner Meinung nach.

           

          Ich würde das Skript mal umbauen:

          If CheckInstallMode(imUninstall)
           If CheckInstallMode(imWkStaPart)
            MSIInstallProduct('.\Extern$\ClientMSI\DISK1\enaio client-Installation.msi','DEBUG',MsiInstMach)
          
             params:ADDLOCAL=Client,OSPrinter,PDFPrinter
            EndProc/TS
            MSIApplyPatch('.\Extern$\ClientMSI\Patch850.msp',MsiInstMach,'')/TS
          !  -
          ! ax.exe im Adminmodus starten, um restliche DLLs zu registrieren
            RunAsEx('C:\Program Files (x86)\OPTIMAL SYSTEMS\OSECM\clients\client32\ax.exe','-i','%h','k2EE817EF5E847F3388G0A','','_return',raUseSisAccount+raHideWindow+Done)/TS
            Sleep('30')
            KillProcess('ax.exe',kpKillOnUninstall+kpKillChildrenToo+kpByFileName+kpKillAll)/TS
          !
          ! Zur Sicherheit regsvrutil ausführen
            ExecuteEx('C:\Program Files (x86)\OPTIMAL SYSTEMS\OSECM\clients\client32\regsvrutil.exe /s ','_return','')/?/TS
            Sleep('60')
          !
          ! Outlook AddIn installieren
            MSIInstallProduct('.\Extern$\enaio_outlook_addin_ng\enaio_Outlook_addin_setup.msi','DEBUG',MsiInstMach)
          
             params:
            EndProc/TS
          ! MS Office AddIn installieren
            MSIInstallProduct('.\Extern$\enaio_office_addin_ng\enaio_Office_addin.msi','DEBUG',MsiInstMach)
          
             params:
            EndProc/TS
          !
          ! Startmenü-Links löschen
            Delete('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\ENAIO\*.*')/S/F/TS
            RemoveDir('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\ENAIO')/S/TS
            ExitProcEx(Done,'Enaio Basispaket installiert')
          !
          !Start Deinstallation
          : $BeginUninstallScript
          ! MS Office und Outlook-AddIn deinstallieren
          MSIUnInstallProduct('{147452B9-0921-435B-848B-1599A6422E19}','enaio Outlook addin 8.50.0.21')/TS
          MSIUnInstallProduct('{62AE0203-3AF2-4997-BC52-609E578CE5F3}','enaio Office Add-In 8.50.6610.26579')/TS
          !
          ! Patch deinstallieren
          ExecuteEx('msiexec.exe /I {3B2BEC58-74F2-4855-A82C-B1097E5A826B} MSIPATCHREMOVE={A140CAAD-E1F0-4A24-99C9-F8020819F5F7} /qb /norestart','_return','5')/?/TS
          ! -
          ! MSI deinstallieren
          MSIUnInstallProductEx('{3B2BEC58-74F2-4855-A82C-B1097E5A826B}','enaio client-Installation 8.50.0000','ADDLOCAL=Client','1','0')/TS
          ! -
          ! Aufräumen
          Delete('C:\Program Files (x86)\OPTIMAL SYSTEMS')/S/F/TS
          RegDeleteKey('HKEY_LOCAL_MACHINE\SOFTWARE\OPTIMAL SYSTEMS','',)/TS
          ExitProcEx(Done,'Enaio Basispaket deinstalliert')
          

           

          Mit den Einrückungen musst Du natürlich nochmal schauen.

          Der Umbau ist aber im wesentlichen, dass die Installation auch nur ausgeführt wird, wenn Du installierst. D.h. bei einer Deinstallation werden die meisten Befehle dann nicht mehr im umgekehrten Modus ausgeführt.

          Der Abschnitt für die Deinstallation wird sowieso nur bei einer echten Deinstallation des Paketes ausgeführt, hier braucht man nicht den Modus zu prüfen.

           

          Gruß

          Nils

          • 2. Re: Wieder mal "automatische Deinstallation" von Paketen
            derniwi Master

            Hallo Oliver,

             

            noch zu den drei Fragen:

             

             

            Ich versteh nicht:

             

             

            1. Warum wird das Goto nicht einfach ausgeführt? Ein Goto zu invertieren ist relativ sinnlos....
            2. Wie der "CheckInstallMode(imUninstall)" zeigt befinden wir uns ja im UnInstallMode. Warum läuft DSM dann trotzdem in den if-Teil des "CheckInstallMode(imWkStaPart)". Sind beide zustände gleichzeitig wahr? imWkStaPart heisst für mich, "installieren, nur Maschinenteile".
            3. Wie kann ich das Skript dazu veranlassen, die Installationsbefehle NICHT zu invertieren, sondern nur die Deinstallationsbefehle nach :BeginUninstallScript auszuführen?

             

            Gruss, Oliver

             

             

            zu 1) genau. Das goto wird nicht umgekehrt. Es kann bei einer Deinstallation ja durchaus sein, dass die If-Bedingungen anders ausgewertet werden. Das ist zwar unschön, aber es ist halt leider so.

             

            zu 2) CheckInstallMode kann mehrere Zustände gleichzeitig haben. "Installation" und "ich bin im Workstationpart" (heißt eigentlich auch nur, dass die aktuelle Ausführung durch den Service Installer läuft) schließen sich nicht aus. Deine Annahme stimmt leider nicht ganz, denn er heißt nur "nur Maschinenteile", aber das kann bei einer Installation und bei einer Deinstallation, aber auch bei einer Reparatur zutreffen...

             

            zu 3) wie gesagt, meist klappt das, wenn man am Anfang prüft, ob man nicht im Deinstallationsmodus ist (wie gesagt, es kann auch eine Reparatur, eine Installation oder eine Neuinstallation sein). Aber auch hier können Befehle umgekehrt ausgeführt werden. Ich hatte eine relativ alte Anwendung, bei der ein Update durch den Austausch von Dateien eingespielt wurde. Nutze ich InstallFileList (oder auch CopyFileList, ist eigentlich der selbe Befehl), dann wird dessen Ausführung immer rückgängig gemacht. Dummerweise wird beim Überschreiben kein Backup erstellt, somit heißt ein Umkehren von Copy => Delete. Was zur Folge hat, dass zuerst durch die Umkehrung Dateien gelöscht werden, später könnte dann die Deinstallationsroutine starten - die schlägt aber fehl, weil Dateien schon gelöscht sind... Man lernt aber relativ schnell, auf so etwas zu achten und nutzt dann zum Kopieren ein cmd-Skript... :-/

             

            Allgemein: eScript ist keine vollwertige Programmiersprache und es gibt einige Stellen, an denen man etwas verbessern kann oder könnte. Die Verwendung von 32 Bit- und 64 Bit-Befehlen ist (auch unter Windows) nicht immer schlüssig. DSM selbst ist ein 32 Bit-System, auch das sollte man im Hinterkopf haben. Die Behandlung vomn Paketen mit Installation, Neuinstallation, Reperatur und Deinstallation macht es manchmal relativ kompiziert, aber hier kann man seit ein paar Versionen auch z.B. die Reperatur verbieten. Und seit der 2018.1 (oder schon 20171?) ist dann auch die Auswahl am Paket dementsprechend inaktiv.

            • 3. Re: Wieder mal "automatische Deinstallation" von Paketen
              olliko Apprentice

              Danke für die Antwort!

               

              Fehlt da nicht noch ein "not" ?

               

              If  not CheckInstallMode(imUninstall) 

              If CheckInstallMode(imWkStaPart) 

                MSIInstallProduct('.\Extern$\ClientMSI\DISK1\enaio client-Installation.msi','DEBUG',MsiInstMach) 

               

              Ich probier das morgen gleich aus und gebe dann Rückmeldung

               

              Gruss, Oliver

               

              • 4. Re: Wieder mal "automatische Deinstallation" von Paketen
                derniwi Master

                Hallo Oliver,

                 

                ja, Du hast recht, das "not" fehlt natürlich.

                Wollte mal schauen, ob Du aufpaßt... :-) :-) :-)

                 

                Gruß

                Nils