Uninstallstring auslesen und gleich ausführen lassen?

Post Reply
sk
Posts: 148
Joined: 14. Dec 2004, 10:09
Contact:

Uninstallstring auslesen und gleich ausführen lassen?

Post by sk » 18. Jan 2010, 12:02

Hallo zusammen,

Aufgabenstellung:

Deinstalliere eine definierte Software jeglicher Version von einem Client

Problem:

Die Software wurde nicht immer per Empirum installiert, wurde manchmal per Hand installiert UND nicht jede Versionsnummer ( GUID) ist bekannt.

Lösungsansatz:

Jetzt habe ich mir gedacht, lese ich doch einfach den Uninstallstring in der Registry aus und führe anschließend genau diesen Uninstall Befehl aus.
Leider steh ich voll auf dem Schlauch, wie ich das machen kann.

Ich würde mir ja dadurch das Herausfinden aller MSI GUID sparen und könnte das Paket universell einsetzen ...

Ich denke daran, in der Registry mit IFDoesRegKeyExist den entsprechenden Produktordner zu finden, und in diesem den Uninstallstring auszulesen.

Geht das direkt zur Laufzeit? Und geht es überhaupt?

Bin für Hinweise und Tipps sehr dankbar!
Gruß

SK

philipp.kiessler
Posts: 248
Joined: 05. Feb 2007, 11:42
Contact:

Post by philipp.kiessler » 18. Jan 2010, 12:49

Ja, das geht. Du kannst als Auszuführenden Befehl für "Call" auch Variablen angeben.

Code: Select all

Set CmdLine = %HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SWName","UninstallString"%
Call "%CmdLine%"
Funktioniert. Ich nutze das mindestens einem Paket um nicht über Empirum installierte Vorversionen vom Rechner zu entfernen. Das klappt aber halt nur, solang das Programm nicht per MSI installiert wurde. Ansonsten ist die MSI GUID im Registrypfad, der zu "UninstallString" führt, enthalten.
Schleifenfunktionen beherrscht die Setup.inf/Setup.exe leider nicht.
Philipp Kießler

sk
Posts: 148
Joined: 14. Dec 2004, 10:09
Contact:

Post by sk » 18. Jan 2010, 13:32

Hi Philipp,

danke für den Tipp, aber wie es nun mal so ist.... das Paket ist eine MSI Installation und unglücklicherweise ist der Uninstallstring auch noch sehr besch***** mit msiexec /i GUID formuliert.

Kann ich nicht nur den Produktcode irgendwo auslesen, den als Variable definieren und dann msiexec /X aufrufen?
So als Idee?
Ist der Produktcode noch irgendwo gespeichert?
Gruß

SK

philipp.kiessler
Posts: 248
Joined: 05. Feb 2007, 11:42
Contact:

Post by philipp.kiessler » 19. Jan 2010, 13:40

Also wenn du ihn irgendwo in der Registry findest, kannst du ihn natürlich auch verwenden.

Code: Select all

Set MSI_GUID = %HKLM,[...]%
Call misexec /X %MSI_GUID%
Aber ob und wo du den Key findest, kann ich dir nicht sagen. Ich kenne die Software nicht, die du zu deinstallieren versuchst und ich weiß nicht, ob und was für Keys die in der Registry hinterlässt.

Also mir fällt keine Stelle ein, an der du an den Code heran kommst, ohne ihn zu kennen.

Vielleicht kannst du ja aber z.B. ein VB-Script schreiben, das nach der GUID sucht und sie dann beim Beenden an die Setup.exe zurück gibt. Dann kannst du in der Setup.inf hingehen und mit dieser ermittelten GUID die Deinstallation starten.

Ich wüsste jetzt aus dem Stehgreif nicht, wie man das genau umsetzt, aber funktionieren müsste das.
Philipp Kießler

KuM
Posts: 15
Joined: 08. Dec 2008, 19:54
Location: Berlin
Contact:

Post by KuM » 20. Jan 2010, 16:53

Hi, hier mein Ansatz.

Code: Select all

[REGQUERYMSISWGUID]
;Findet die passende MSI Software GUID
-ReplaceEnv MSISWGUID
-Set MSISWGUID=%%HKLM,"Software\M42\%DeveloperName%\%ProductName%\%Version%",MSISWGUID %MSISWGUID%%%
-Callhidden CMD /C FOR /f "tokens=*" %%i IN ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall') DO reg query "%%i" /v DisplayName 2>NUL: | find /i /c "%MSIDisplayName%" >NUL: && reg add "HKLM\Software\M42\%DeveloperName%\%ProductName%\%Version%" /v MSISWGUID /d "%%~nxi" /f
;Setzen der Variable MSIDisplayName mit dem Displayname aus dem Registry\Produkt\UnistallKey - Versions Nummer weg lassen
-Set MSIDisplayName = Beispiel: Java(TM) 6
Aufruf im Uninstall mit:

Code: Select all

[Set:UninstallMSI]
-ErrorLogMsg "> Set:UninstallMSI End"
If DoesRegKeyExist ("HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{GUID},UnInstallString") == "1" Then "AbortMSIUnInst" EndIf
-AddMeter 10
;Errorhandling, Es findet die Auswertung des durch die Installation zurückgegebenen Errorlevels statt.
#!MSIErrorUninst
If %ErrorLevel% == "3010" Then "RebootRequired" EndIf
-Call MsiExec /X %MSISWGUID% REBOOT=REALLYSUPPRESS /passive /norestart /L "%LogFile%"
-ErrorLogMsg "%Logfile%"
#REGQUERYMSISWGUID
-AddMeter 50
-ErrorLogMsg "> Set:UninstallMSI Start"
Achtung: Die Backslashs fehlen!
Last edited by KuM on 20. Jan 2010, 17:09, edited 1 time in total.

Marcus_B
Posts: 126
Joined: 15. Jul 2008, 13:02
Location: Berlin
Contact:

Post by Marcus_B » 20. Jan 2010, 17:09

Jetzt siehts gut aus. Funktioniert super.

philipp.kiessler
Posts: 248
Joined: 05. Feb 2007, 11:42
Contact:

Post by philipp.kiessler » 21. Jan 2010, 08:16

@KuM: Hey, geniale Umsetzung!

Wenn das in eine Installation soll, Minuszeichen am Anfang entfernen und die Zeilenreihenfolge auf den Kopf stellen...
Philipp Kießler

sk
Posts: 148
Joined: 14. Dec 2004, 10:09
Contact:

Post by sk » 21. Jan 2010, 20:10

WOW!

Ehm..... ja genau so würd ich es auch machen ;)
Ich hab ehrlich gesagt keine Ahnung was KuM da macht, ich glaub ich muss den Code noch ein wenig anstarren......vlt. geht mir dann ein Licht auf.

Auf jeden Fall: DANKE für die Hilfe, so langsam komm ich vorran.

sk
Gruß

SK

philipp.kiessler
Posts: 248
Joined: 05. Feb 2007, 11:42
Contact:

Post by philipp.kiessler » 22. Jan 2010, 08:13

sk wrote:[...]Ich hab ehrlich gesagt keine Ahnung was KuM da macht[...]
Also wenn ich das richtig verstanden habe, macht der folgendes:
Er ruft einen Batchbefehl auf, der den Registryzweig "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall" nach einem festzulegenden DisplayName durchsucht die zugehörige MSI GUID ermittelt, die der selbe Befehl an einer bekannten Stelle ("HKLM\\Software\\M42\\%DeveloperName%\\%ProductName%\\%Version%") in die Registry schreibt. Anschließend liest das Setup.inf-Script sie von dort wieder aus und macht sie scriptweit verfügbar.
Und "zum Schluss" geht er hin und weist mit der ermittelten GUID die msiexec an, die Software zu deinstallieren.

Man könnte das ganze von der GUID auch auf den UninstallString adaptieren, das würde von der Vorgehensweise genauso klappen, wenn ich das richtig verstehe.
Philipp Kießler

Post Reply

Return to “Paketierung”

Who is online

Users browsing this forum: No registered users and 10 guests