Page 1 of 1

Regkey auslesen mit GetUninstallKeyName

Posted: 28. Jul 2020, 14:05
by Yilmaz
Hallo zusammen,

ich bin dabei ein Paket zu erstellen das vorher die Registry nach dem Displaynamen prüft und sollte das existieren einen Reinstall manchen ansonsten halt eine komplett Installation.

[Set Product]

Code: Select all

Set V_MSIGUID = GetUninstallKeyName("%V_MSIDisplayName%*", "%V_MSIArch%")
If "%V_MSIGUID%" == "" Then "InstallMSI" Else "RepairMSI" EndIf

[InstallMSI]
Call MsiExec /I "%Src%\%VM_SourceDir%\%V_MSIFileName%"  /q /Li "%MSILogFile%"
If "%Errorlevel%" == "3010" Then "RebootRequired" EndIf
Sleep 3000
Set V_MSIGUID = GetUninstallKeyName("%V_MSIDisplayName%*", "%V_MSIArch%")
If "%V_MSIGUID%" == "" Then "AbortMSI" EndIf

Leider findet er nichts und versucht eine komplett Installation und bricht mit einer Fehlermeldung ab nach erneuter Prüfung des Regkeys. Obwohl das Programm installiert ist.
In der Registry wird der Uninstallstring angezeigt.

Kann mir einer dazu einen Hinweis geben was falsch ist ?

Re: Regkey auslesen mit GetUninstallKeyName

Posted: 29. Jul 2020, 14:18
by Yilmaz
Wie kann ich das eingrenzen das nur in HKLM nach dem Wert gesucht wird?

Anscheinend wird gar nicht gesucht und somit fährt die Installation gegen die Wand.

Habe zwar diesen
Post im Forum gefunden aber das funktioniert leider auch nicht bei mir :-(

Der Gedanke ist das bei MSI Paketen ist die GUID nicht immer bekannt, da mal ohne Empirum installiert wurde und nur PackageName bekannt ist und somit ein Update ohne viel suchen erfolgen könnte.

Re: Regkey auslesen mit GetUninstallKeyName

Posted: 29. Jul 2020, 21:06
by Frank Dethlefsen
Moin!

Vielleicht passt die Platform-Option in der Setup.inf nicht zur %V_MSIArch%?
Vielleicht auch mal beim DisplayName mit Platzhalter * vorne bzw. hinten ausprobieren?
Hier noch mal die Hilfe:

------------------------------------------------------------------------------------------------------------------
GetUninstallKeyName ("<DisplayName>", "<RegistryViewFlag>")

Ermittelt den Registrierungsschlüssel, mit dem ein Paket mit dem übergebenen String <DisplayName> unterhalb des Schlüssels "HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall" in der Registrierungsdatenbank eingetragen ist. Der Platzhalter * ist am Anfang und am Ende des Suchbegriffes erlaubt.

Der zweite Parameter <RegistryViewFlag> bestimmt auf einem 64 Bit Betriebssystem, ob im 32 Bit oder 64 Bit Bereich der Registrierungsdatenbank gesucht werden soll. Auf 32 Bit Betriebssystemen wird das Flag ignoriert. Wenn dieser Parameter leer ist, wird die Plattform der ausführenden Setup.exe verwendet.

Die Funktion gibt einen String mit dem ersten gefundenen Schlüssel oder einen leeren String zurück.

Mit dem ermittelten Schlüssel kann man beispielsweise eine universelle Deinstallation von MSI Paketen erreichen, selbst wenn deren MSI GUID durch Updates geändert wurden.

Beispiel:

Der DisplayName im Uninstall Registry Schlüssel lautet "Adobe Reader XI (11.0.08)"

Set GUID = GetUninstallKeyName("Adobe Reader*", "x86")

Echo %GUID%

Rem Ergebnis "{AC76BA86-7AD7-1031-7B44-AB0000000001}"
------------------------------------------------------------------------------------------------------------------
:roll:

Re: Regkey auslesen mit GetUninstallKeyName

Posted: 25. Jan 2021, 10:51
by Yilmaz
Hallo Herr Dethlefsen,

wie ist es aber wenn der RegKeyName (Displayname) nicht HKLM sondern HKCU nur zufinden ist.
wird auch dann in dem Zweig gesucht oder nur HKLM\software\...\Uninstall\.. mit GeuUnstallKeyName?

Ich habe ein Paket das kein Registry Schlüssel in HKLM sondern nur unter HKCU\Software..\Uninstall abgelegt hat.

Re: Regkey auslesen mit GetUninstallKeyName

Posted: 25. Jan 2021, 11:06
by Frank Dethlefsen
Moin!

Der Befehl GetUninstallKeyName gilt nur für HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall bzw. HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall. Siehe unten Online-Hilfe. Wenn nötig müsste man da wohl selbst etwas basteln per Powershell, VBS oder AutoIt.

GetUninstallKeyName ("<DisplayName>", "<RegistryViewFlag>")

Ermittelt den Registrierungsschlüssel, mit dem ein Paket mit dem übergebenen String <DisplayName> unterhalb des Schlüssels "HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall" in der Registrierungsdatenbank eingetragen ist. Der Platzhalter * ist am Anfang und am Ende des Suchbegriffes erlaubt.

Der zweite Parameter <RegistryViewFlag> bestimmt auf einem 64 Bit Betriebssystem, ob im 32 Bit oder 64 Bit Bereich der Registrierungsdatenbank gesucht werden soll. Auf 32 Bit Betriebssystemen wird das Flag ignoriert. Wenn dieser Parameter leer ist, wird die Plattform der ausführenden Setup.exe verwendet.

Die Funktion gibt einen String mit dem ersten gefundenen Schlüssel oder einen leeren String zurück.

Mit dem ermittelten Schlüssel kann man beispielsweise eine universelle Deinstallation von MSI Paketen erreichen, selbst wenn deren MSI GUID durch Updates geändert wurden.

Beispiel:

Der DisplayName im Uninstall Registry Schlüssel lautet "Adobe Reader XI (11.0.08)"

Set GUID = GetUninstallKeyName("Adobe Reader*", "x86")

Echo %GUID%

Rem Ergebnis "{AC76BA86-7AD7-1031-7B44-AB0000000001}"