Uninstallstring auslesen und gleich ausführen lassen?

Antworten
sk
Beiträge: 147
Registriert: 14. Dez 2004, 10:09
Kontaktdaten:

Uninstallstring auslesen und gleich ausführen lassen?

Beitrag von 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
Beiträge: 248
Registriert: 05. Feb 2007, 11:42
Kontaktdaten:

Beitrag von philipp.kiessler » 18. Jan 2010, 12:49

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

Code: Alles auswählen

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
Beiträge: 147
Registriert: 14. Dez 2004, 10:09
Kontaktdaten:

Beitrag von 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
Beiträge: 248
Registriert: 05. Feb 2007, 11:42
Kontaktdaten:

Beitrag von philipp.kiessler » 19. Jan 2010, 13:40

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

Code: Alles auswählen

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
Beiträge: 15
Registriert: 08. Dez 2008, 19:54
Wohnort: Berlin
Kontaktdaten:

Beitrag von KuM » 20. Jan 2010, 16:53

Hi, hier mein Ansatz.

Code: Alles auswählen

[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: Alles auswählen

[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!
Zuletzt geändert von KuM am 20. Jan 2010, 17:09, insgesamt 1-mal geändert.

Marcus_B
Beiträge: 126
Registriert: 15. Jul 2008, 13:02
Wohnort: Berlin
Kontaktdaten:

Beitrag von Marcus_B » 20. Jan 2010, 17:09

Jetzt siehts gut aus. Funktioniert super.

philipp.kiessler
Beiträge: 248
Registriert: 05. Feb 2007, 11:42
Kontaktdaten:

Beitrag von 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
Beiträge: 147
Registriert: 14. Dez 2004, 10:09
Kontaktdaten:

Beitrag von 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
Beiträge: 248
Registriert: 05. Feb 2007, 11:42
Kontaktdaten:

Beitrag von philipp.kiessler » 22. Jan 2010, 08:13

sk hat geschrieben:[...]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

Antworten

Zurück zu „Paketierung“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste