6 Replies Latest reply on Aug 16, 2018 1:11 AM by CGR

    Saubere Deinstallation über den Shop.

    CGR Specialist

      Hiho,

       

      ich wollte jetzt mal anfangen die ganzen Packages zu überarbeiten um auch die Deinstallation via Shop zu ermöglichen. (Aktuell nur manuell via Systemsteuerung).

       

      Jetzt wollte ich hierzu mal ein paar Beispiele hören wie man da am besten vorgeht.

       

      MSI Pakete werden ja meines wissens nach automatisch von Enteo erkannt und somit ist hier auch eine Deinstallation möglich. Jetzt hab ich z.B. aber die Office 2010 Installation über eine Exe ausgeführt.

      Würde es hier jetzt langen wenn ich einen Kill Process mache mit anschließenden execute ex auf den UninstallString aus der Registry?

       

      Bsp:

      ExecuteEx('MsiExec.exe /X{90140000-0011-0000-0000-0000000FF1CE} /qn /norestart','_return','10')/?

        • 1. Re: Saubere Deinstallation über den Shop.
          KaiNitzsche Apprentice

          Hi.

           

          Wie du schon sagtest klappt bei MSI-Files die Umkehr des Befehls "MSIInstallProduct" insofern der Haken beim Paket bei "Automatische Deinstallion" gesetzt ist. Ein ExecuteEx mit MSIEXEC /I...……. kann DSM aber nicht automatisch rückgängig machen! Hängt also vom Aufbau eurer Scripte ab. Wie du schon vermutest hast, ansonsten die Uninstall-Strings aus der Registry.

           

           

          Viele Grüße

          Kai

          • 2. Re: Saubere Deinstallation über den Shop.
            derniwi Master

            Hallo,

             

            naja, Du solltest nur die per Shop deinstallieren lassen, die auch per Shop auf den Rechner kamen.

             

            Bei Office würde ich zuerst die Sprachpakete entfernen, falls welche installiert wurden. Das ginge auch über die Kommandozeile.

            Office 2010 kann man z.B. so entfernen:

            ExecuteEx('\Extern$\Setup.exe /uninstall PROPLUS /config ".\\Extern$\ProPlus.WW\config.xml"','Returncode','120')

             

            Die config.xml ist die gleiche, die ich auch bei der Installation einsetze. Evtl. kann man noch mit

            If MsiIsProductInstalled('{90140000-0011-0000-0000-0000000FF1CE}')

            vorher prüfen, ob Office 2010 überhaupt vorhanden ist.

             

            Letztlich teste ich bei allen Paketen, ob eine Deinstallation möglich und das System danach wieder (relativ) sauber ist. Das geht eigentlich mit den allermeisten Anwendungen gut, aber Ausnahmen mit alten InstallShield-Routinen können einem das Leben hier schwer machen... ;-)

             

            Ach ja, die config.xml ist hier recht schlank:

            <Configuration Product="ProPlus">

            <Display Level="none" CompletionNotice="no" SuppressModal="yes" AcceptEula="yes" />

            <Setting Id="SETUP_REBOOT" Value="Never" />

            </Configuration>

             

            Gruß

            Nils

            • 3. Re: Saubere Deinstallation über den Shop.
              SitzRieSe Expert

              Hi CGR,

               

              ich weiß genau was du meinst, gerade mit APM zusammen kann das Deinstallieren von MSI Paketen über DSM Tricky sein. Denn der Produktcode ändert sich ja nach dem Update über APM. Wir haben daher alle Pakete angepasst und die Deinstallation wie folgt gelöst:

               

               

              !==============================================

              !- Variables for Uninstallation

              !

              Set('DisplayNameValue','Google Chrome')

              Set('RegPathResult','')

              Set('RegistryValue','DisplayName')

              Set('RegistryPath','HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall')

              !

              !==============================================

              If not CheckInstallMode(imUninstall)

              !

              : GeneratedInstallCodeStart

              MSIInstallProduct('.\Extern$\Msidata\GoogleChromeStandaloneEnterprise.msi','NORMAL',MsiInstMach)

               

                params:

              EndProc/TS

              : GeneratedInstallCodeEnd

              !

              : $BeginUninstallScript

              !==============================================

              !=== Enable for x64 application

              !CallScript('.\Extern$\RegSearch.ps1','')/x64/TS

              !ExecuteEx('Msiexec /X%RegPathResult% /quiet','exitcode','120')/?/TS

              !If not %exitcode%='0'

              ! If not %exitcode%='3010'

              !  ExitProcEx(Failed,'The Uninstallation failed with %exitcode%')

              !=== Enable for x86 application

              CallScript('.\Extern$\RegSearch.ps1','')/TS

              ExecuteEx('Msiexec /X%RegPathResult% /quiet','exitcode','120')/?/TS

              If not %exitcode%='0'

              If not %exitcode%='3010'

                ExitProcEx(Failed,'The Uninstallation failed with %exitcode%')

               

              Im Powershell:

               

              # In der Registry nach einer Variable und dem entsprechenden Inhalt suchen.

              # zu suchende Variable

              $searchForName  = Get-NiVar "RegistryValue"

               

              # zu suchender Wert

              $searchforValue = Get-NiVar "DisplayNameValue"

               

              # zu durchsuchender Pfad

              $searchforPath = Get-NiVar "RegistryPath"

               

              $return = (Get-ChildItem $searchforPath | Get-ItemProperty | where {$_.$searchForName -match $searchForValue } | select -last 1)

              if($return) {

                  $return = $return.PSChildName

                  if($return) {

                      Set-NiVar "RegPathResult" $return

                  }

              }

               

              Damit sucht dann das Paket nach Google Chrome in der Registry und gibt den Schlüssel zurück. Den Schlüssel benutzt er dann zum deinstallieren. Damit funktioniert die Deinstallation dann Versionsübergreifend und auch aus dem Shop.

               

              Wir benutzen das mittlerweile auch etwas angepasst für .exe Pakete. Damit sind die Skripte noch universeller und man muss nix mehr anpassen wenn eine neue Version released wird. Klar kann es sein das der Search String nicht mehr stimmt. Wir setzen das jetzt so aber ca ein Jahr ein und da ist das bisher bei keiner Software vorgekommen.

               

              Aber Ausnahmen bestätigen ja die Regel Der RegSearch Command nativ im DSM hat übrigens bei uns nicht funktioniert, weil der Command nicht mit Wildcards umgehen konnte, da musste man dann immer den gesammten String suchen. Da einige Software aber auch die Version im Display Name stehen haben, war das schon wieder ein KO.

               

              Update:

               

              Achso! Den Uninstall String lesen deswegen nicht aus, weil einige Software dort ebenfalls Msiexec /I hinterlegen. Warum auch immer... Daher nehmen wir den Schlüssel!


              Gruß

               

              Alex

              • 4. Re: Saubere Deinstallation über den Shop.
                derniwi Master

                Hallo,

                 

                das PS-Skript kenne ich... :-)

                 

                Etwas aufpassen muss man natürlich wieder bei 64-Bit-Systemen und 32-Bit Programmen.

                 

                Warum nutzen manche Programme "msiexec.exe /i"? Naja, die haben die Deinstallation innerhalb eines Dialgos eingebaut, der auch Reparatur und Änderungen des Paketes ermöglicht. Weiterhin ist die Deinstallation über den Uninstall-String meist mit einem Dialog und einem Abschluss-Fenster versehen, so dass man hier evtl. noch ein "/passive /quiet / norestart" einbauen muss. Meist ginge das am Ende der Zeile... meist...

                 

                Es gibt auch Programme, die mehrfach installiert sein können, z.B. Java als Version 6, 7, 8... da hilft das Skript dann auch gut.

                 

                Für normale MSI-Pakete kann man auch schauen, ob man für Anpassungen den Parameter "%CurrentPackage.MsiPackageProps.ProductCode%" verwendet. Dann muss man bei Aktualisierungen des DSM-MSI-Paketes aber auch den Produktcode des verwendeten MSI-Packages aktualisieren.

                 

                Letztlich kommt es auf die Art der MSI-Installation an. Wenn das mit den internen Befehlen sauber funktioniert, dann kann man ein solches Paket auch nicht über die Systemsteuerung entfernen. Und natürlich kommt es auf die Rechte der Benutzer an. Sind die lokale Administratoren, dann ist es oft sehr kompliziert... ansonsten schaue ich bei allen Anwendungen, dass es keine automatische Aktualisierung durch das Programm selbst gibt. Das ist beim Flash-Player schon etwas doof, aber nicht so ganz schlimm, da dieser in der Regel nicht entfernt wird. Bei anderen Programmen kann es da schon schwieriger werden, wenn wir die neue Version noch nicht freigegeben, aber die Anwender sich ein Update installiert haben... und ärgerlich ist es, wenn eine Anwendung kein Update / Upgrade unterstützt, sondern hier zuerst die Deinstallation der vorherigen Version ausführt bzw. man die alte Version zuerst entfernen muss.

                 

                Gruß

                Nils

                • 5. Re: Saubere Deinstallation über den Shop.
                  SitzRieSe Expert

                  Hi Nils,

                   

                  Das muss man natürlich vorher mal testen! Wenn es aber bei der ersten Version klappt, funktioniert es in der Regel auch weiterhin für die späteren Installer. Klar kanns bei so einem Skript mal dann bei einer Anwendung doch eine Ausnahme geben, aber wie gesagt wir setzen das jetzt über ein Jahr ein und nutzen das in allen Paketen und haben bisher keine Probleme. Das ein Hersteller mal den Installer wechselt kommt gottseidank scheinbar selten vor.

                   

                  Eine andere Chance sehe ich sonst nicht das Problem mit der Deinstallation zu regeln wenn man APM einsetzt.

                   

                  Wir haben teilweise auch mit Bestandssystemen von Kunden zu tun, die zuvor manuell oder über andere Lösungen installiert wurden. Dort findet man dann auch ein Software Wildwuchs vor und da ist diese Uninstall Methode ebenfalls super um alte Softwarestände vorher zu entfernen.

                   

                  PS: 64bit ist in meinem Paket berücksichtigt, da muss man dann den entsprechenden Teil einkommentieren Da man eh einmal in der Registry nach dem eingetragenen Display Name Value schauen sollte, weiß man dann auch gleich in welchem Hive sich der Regschlüssel versteckt.

                   

                  Hier mal noch die Uninstall Strings für unsere .exe Pakete:

                  !==============================================

                  !- Variables for Uninstallation

                  !

                  Set('DisplayNameValue','0')

                  Set('UninstallParameter','0')

                  !

                  !

                  Set('RegPathResult','')

                  Set('RegistryValue','DisplayName')

                  Set('RegistryPath','HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall')

                  !==============================================

                  !=== Enable for x64 application

                  !CallScript('.\Extern$\RegSearch.ps1','')/x64/TS

                  !RegReadValueEx('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%RegPathResult%','UninstallString','Uninstall',reUseX64Hive)

                  !ExecuteEx('%Uninstall% %UninstallParameter%','exitcode','120')/?/TS

                  !If not %exitcode%='0'

                  ! If not %exitcode%='3010'

                  !  ExitProcEx(Failed,'The Uninstallation failed with %exitcode%')

                  !=== Enable for x86 application

                  !CallScript('.\Extern$\RegSearch.ps1','')/TS

                  !RegReadValueEx('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%RegPathResult%','UninstallString','Uninstall',)

                  !ExecuteEx('%Uninstall% %UninstallParameter%','exitcode','120')/?/TS

                  !If not %exitcode%='0'

                  ! If not %exitcode%='3010'

                  !  ExitProcEx(Failed,'The Uninstallation failed with %exitcode%')

                  !==============================================

                  !MSI Installer

                  !=== Enable for x64 application

                  !CallScript('.\Extern$\RegSearch.ps1','')/x64/TS

                  !ExecuteEx('Msiexec /X%RegPathResult% /quiet','exitcode','120')/?/TS

                  !If not %exitcode%='0'

                  ! If not %exitcode%='3010'

                  !  ExitProcEx(Failed,'The Uninstallation failed with %exitcode%')

                  !=== Enable for x86 application

                  !CallScript('.\Extern$\RegSearch.ps1','')/TS

                  !ExecuteEx('Msiexec /X%RegPathResult% /quiet','exitcode','120')/?/TS

                  !If not %exitcode%='0'

                  ! If not %exitcode%='3010'

                  !  ExitProcEx(Failed,'The Uninstallation failed with %exitcode%')

                  !==============================================

                  !Wise Installer

                  !=== Enable for x64 application

                  !CallScript('.\Extern$\RegSearch.ps1','')/x64/TS

                  !RegReadValueEx('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%RegPathResult%','QuietUninstallString','Uninstall',reUseX64Hive)

                  !ExecuteEx('%Uninstall%','exitcode','120')/?/TS

                  !If not %exitcode%='0'

                  ! If not %exitcode%='3010'

                  !  ExitProcEx(Failed,'The Uninstallation failed with %exitcode%')

                  !=== Enable for x86 application

                  !CallScript('.\Extern$\RegSearch.ps1','')/TS

                  !RegReadValueEx('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%RegPathResult%','QuietUninstallString','Uninstall',)

                  !ExecuteEx('%Uninstall%','exitcode','120')/?/TS

                  !If not %exitcode%='0'

                  ! If not %exitcode%='3010'

                   

                  !  ExitProcEx(Failed,'The Uninstallation failed with %exitcode%')

                   

                  Hier muss man eben dann auch den passenden Teil einkommentieren.

                   

                  Gruß

                   

                  Alex

                  • 6. Re: Saubere Deinstallation über den Shop.
                    CGR Specialist

                    Hahahaha, danke Alex, so hab ich mir das Vorgestellt glei mim ganzen SourceCode und universell einsetzbar. Muss i glei mal testen. 1000 Dank    TOP!