Uninstallstring auslesen und gleich ausführen lassen?
Uninstallstring auslesen und gleich ausführen lassen?
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!
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
SK
-
- Posts: 248
- Joined: 05. Feb 2007, 11:42
- Contact:
Ja, das geht. Du kannst als Auszuführenden Befehl für "Call" auch Variablen angeben.
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.
Code: Select all
Set CmdLine = %HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SWName","UninstallString"%
Call "%CmdLine%"
Schleifenfunktionen beherrscht die Setup.inf/Setup.exe leider nicht.
Philipp Kießler
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?
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
SK
-
- Posts: 248
- Joined: 05. Feb 2007, 11:42
- Contact:
Also wenn du ihn irgendwo in der Registry findest, kannst du ihn natürlich auch verwenden.
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.
Code: Select all
Set MSI_GUID = %HKLM,[...]%
Call misexec /X %MSI_GUID%
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
Hi, hier mein Ansatz.
Aufruf im Uninstall mit:
Achtung: Die Backslashs fehlen!
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
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"
Last edited by KuM on 20. Jan 2010, 17:09, edited 1 time in total.
-
- Posts: 248
- Joined: 05. Feb 2007, 11:42
- Contact:
-
- Posts: 248
- Joined: 05. Feb 2007, 11:42
- Contact:
Also wenn ich das richtig verstanden habe, macht der folgendes:sk wrote:[...]Ich hab ehrlich gesagt keine Ahnung was KuM da macht[...]
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
Who is online
Users browsing this forum: No registered users and 3 guests