figar0
Goto Top

bestimmten Registry Wert unter unbekanntem Schlüssel suchen und einen anderen Wert unter dem gefundenem Schlüssel auslesen

Moin, Moin,
ich habe hier schon mehrere Beiträge gelesen, für mein Problem aber noch keine Lösung daraus ableiten können. Daher nun meine Frage an die "grosse Runde".

Ich möchte, am liebsten per Batch, einen mir unbekannten Registry Schlüssel anhand eines bekannten Wertes in diesem Schlüssel finden und anschliessend einen bestimmten Wert im gefundenen Schlüssel auslesen.

Hintergrund ist eine VPN Software, die ich Silent deinstallieren möchte. Leider hat die Software die Angewohnheit, sich bei jeder Installation unter einer neuen GUID in die Registry unter "HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\<wechselnde GUID>" zu schreiben.

Bekannt ist der Wert "DisplayName" unter dem Schlüssel "HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\<wechselnde GUID>" .

Ich benötige dann den Inhalt des Wertes "UninstallString" im gefundenen Schlüssel um ihn dann aufzurufen.
Leider lässt sich diese spezielle Software auch nur über "msiexec /X<weschselnde GUID>" deinstallieren. Diesen String möchte ich dann mit /qn /norestart erweitern um die Deinstallation zu starten

Ich habe es nun immerhin schon geschafft mit einer CMD den String Display Name zu finden: (im Beispiel wird nach "Windows Resource Kit Tools" gesucht)

@echo off
cls
set SSW=Windows Resource Kit Tools
FOR /F "tokens=1,3,4,5,6" %%A IN ('reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall /s') DO IF "%%A %%B %%C %%D %%E" EQU "DisplayName %SSW%" goto erfolg  
echo     %SSW% wurde leider nicht gefunden.
goto eol
:erfolg
echo     %SSW% wurde gefunden.
:eol

Was mir jetzt fehlt, ist der Name des Schlüssels, in dem der gesuchte Wert %SSW% gefunden wurde. ich könnte dann entweder den Wert "UninstallString" auslesen wollen, um dann die Silent Deinstallation zu starten,
oder auch den Namen des Schlüssels verwenden, um die Deinstallation per msiexec /X<gefundene GUID> /qn /norestart zu starten.

Ich hoffe, ich habe mich enigermassen verständlich ausgedrückt und mein Problem wird verstanden. Natürlich bin ich für jeden Lösungsansatz dankbar.

Content-ID: 121488

Url: https://administrator.de/contentid/121488

Ausgedruckt am: 26.11.2024 um 09:11 Uhr

ralfkausk
ralfkausk 28.07.2009 um 17:39:54 Uhr
Goto Top
da ich es immer sehr anstrengend finde "nur" mit Windows Bordmitteln zu arbeiten, benutze ich die UNIX-Tools-für-Windows (http://unxutils.sourceforge.net/), http://www.winfaq.de/faq_html/Content/tip1000/onlinefaq.php?h=tip1488.h ..)

Entpacken und in einen Ordner kopieren der schon in den Systemvariablen eingebunden ist (z.B. c:\windows\system32) oder einen neuen Ordner anlegen und in die variablen eintragen (bevorzugt einen neuen ordner nehmen)

Danach stehen sehr viele mächtige tools aus der UNIX-Welt zur verfügung die Dir das Leben sehr vereinfachen können.

Die suche könnte dann folgendermaßen aussehen:
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\uninstall | grep DisplayName

Beispiel:
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\uninstall|grep -i book
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\uninstall\AddressBook

wenn du dir nicht sicher bist bei der Schreibweise (ob GROß oder klein) dann lieber so:
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\uninstall | grep -i DisplayName

Was auch immerr Du an dieser stelle findest kannst Du entweder "nur" ausgeben lassen oder mit einer weiteren pipe (|) weiterverarbeiten. bedeutet im Klartext, Du kannst den gefundenen wert direkt ausführen lassen und somit würde die Software in einen Arbeitsschritt gefunden und Deinstalliert werden

P.S.
die unix-tools haben in der Regel alle eine Hilfefunktion die über --help aufgerufen werden kann
z.B.
grep --help
Usage: grep [OPTION]... PATTERN [FILE] ...
Search for PATTERN in each FILE or standard input.
Example: grep -i 'hello world' menu.h main.c
60730
60730 28.07.2009 um 17:59:36 Uhr
Goto Top
Servus,

da ich es immer sehr anstrengend finde "nur" mit Windows Bordmitteln zu arbeiten, benutze ich die UNIX-Tools-für-Windows

Was ja "eigentlich" nix verkehrtes wäre face-wink
Und da Billy Boy und seine Praktikanten eh gerne bei Unix "ähh" "fremd finden" ...

Die suche könnte dann folgendermaßen aussehen:
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\uninstall | Find "DisplayName"

Gruß
figar0
figar0 28.07.2009 um 18:22:15 Uhr
Goto Top
Danke für die Antworten, leider helfen sie mir aber nicht weiter.

Den Wert DisplayName kenne ich ja. Mit diesem Wert (in der obigen CMD=Windows Resource Kit Tools ) gehe ich ja auf die Suche...

Was ich als Ergebnis benötige, ist der Name des übergeordneten Registryschlüssels in dem der gesuchte DisplayName gefunden wurde (z.B. {FA237125-51FF-408C-8BB8-30C2B3DFFF9C}), oder aber der Inhalt des Wertes UninstallString in denselbem Schlüssel, in dem der Wert gefunden wurde (z.B. MsiExec.exe /I{FA237125-51FF-408C-8BB8-30C2B3DFFF9C}).
rubberman
rubberman 28.07.2009 um 19:19:02 Uhr
Goto Top
Naja, so schwer sollte das nicht sein.
Probier mal
@echo off &setlocal
set "name=Bonjour"  
for /f "tokens=7 delims=\" %%i in ('reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\^|findstr "Uninstall\\\\{"') do (  
 for /f "tokens=2* delims=	" %%j in ('reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%%i^|findstr /c:"DisplayName	"^|findstr /c:"%name%"') do echo %%i %%k  
)
pause
Das Bonjour war mein Testwert, musst du mit deinem ersetzen. In %%i steht der von dir gesuchte Key, %%k ist nur zur Kontrolle.

<edit> Option /s kann man sich natürlich schenken -> entfernt. </edit>
60730
60730 28.07.2009 um 19:20:17 Uhr
Goto Top
Danke für die Antworten, leider helfen sie mir aber nicht weiter.

Servus und "sorry" - dein Ansatz machte den Eindruck - du brauchst nur einen Anschubser und nicht die ganze Packung...

reg query HKLM\Software\Microsoft\Windows\CurrentVersion\uninstall | Find "DisplayName" >123.txt  
for /f "tokens=6,7 delims=\" %%a in (123.txt) do echo %%b  

Gruß
figar0
figar0 29.07.2009 um 09:38:52 Uhr
Goto Top
@rubberman
Ja, das sieht gut aus...
ich habe aus dem Do echo %%i mal ein Set GGUID=%%i gemacht und schon habe ich den fertigen Aufruf.
Super, vielen Dank.

@echo off
setlocal
set "name=Windows Resource Kit Tools"  
for /f "tokens=7 delims=\" %%i in ('reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\^|findstr "Uninstall\\\\{"') do (  
 for /f "tokens=2* delims=	" %%j in ('reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%%i^|findstr /c:"DisplayName	"^|findstr /c:"%name%"') do set GGUID=%%i  
)
echo msiexec /X%GGUID% /qr /norestart
pause

Ich muss aber leider zugeben, dass ich den Code nicht zu 100% verstehe. Werde mich wohl am Ende der Woche ein wenig genauer damit auseinander setzten.
Nochmals Vielen Dank, natürlich an alle, die geantwortet haben und auch an die, die es noch wollten face-wink
figar0
figar0 29.07.2009 um 09:46:55 Uhr
Goto Top
@timobeil
Meinen Satz mit dem "leider helfen Sie mir aber nicht weiter..." war natürlich nicht böse gemeint, also gibt es keinen Grund sich zu entschuldigen.

Leider bekomme ich kein Ergebnis für "%%b". Daher würde mich nun aus reiner Neugierde interessieren, was Du als Ausgabe erwartet hattest?
60730
60730 29.07.2009 um 09:51:33 Uhr
Goto Top
face-wink passt schon.

ich hab keinen passenderen Wert in meiner Registry gefunden..
Und der - der in meinen Augen gepasst hat, war nach dem 7 \ von daher das %%B.

ich hätte auch Tokens=7 und %%a nehmen können oder 5 und %%C

wobei die doppelte Schleife und das weglassen der 123.datei natürlich wesentlich eleganter ist.

Gruß
xxsadmin
xxsadmin 30.06.2011 um 18:48:04 Uhr
Goto Top
-
xxsadmin
xxsadmin 30.06.2011 um 19:09:07 Uhr
Goto Top
Hallo zusammen,

bis jetzt haben wir nur XP in Einsatz gehabt und diese Abfrage hat einwandfrei funktioniert. Leider funktioniert sie nicht mehr unter Windows 7. Nun kommen bei uns immer mehr Windows 7 Rechner und ich würde lieben gerne sie weiter benutzen. Am liebsten wäre es mir natürlich wenn Sie unter beide Systeme (XP;7) funktioniert.

Es wäre nett, wenn mir jemand hier weiter helfen könnte.

Vielen dank
rubberman
rubberman 30.06.2011 um 22:51:21 Uhr
Goto Top
Hallo xxsadmin.

In erster Linie funktioniert es nicht mehr, weil auf Win7 die Ausgabe nicht mehr durch Tabs, sondern durch Spaces getrennt kommt. Da Space und Tab sowieso beides Standarddelimiter in FOR Schleifen sind, sollte es möglich sein das Ganze mit ein paar Anpassungen für beide Systeme rennen zu lassen.
Folgendes funktioniert bei mir auf Win7:
@echo off &setlocal

set "name=Microsoft Choice Guard"  

for /f "tokens=7 delims=\" %%i in (  
  'reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"^|findstr /riec:"\\Uninstall\\{[0-9A-F][0-9A-F]*-[0-9A-F][0-9A-F]*-[0-9A-F][0-9A-F]*-[0-9A-F][0-9A-F]*-[0-9A-F][0-9A-F]*}"'  
) do (
  for /f "tokens=2*" %%j in (  
    'reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%%i" /v "DisplayName" 2^>nul^|findstr /iec:"%name%"'  
  ) do echo %%i %%k
)
pause
Nun liegt's noch an dir herauszufinden, ob das auch auf XP rennt face-wink

Grüße
rubberman
60730
60730 30.06.2011 um 23:17:33 Uhr
Goto Top
Servus Rubberman
Zitat von @rubberman:
Nun liegt's noch an dir herauszufinden, ob das auch auf XP rennt face-wink
Hab ich ihm abgenommen
tuts (wie zu erwarten war)
Grüße
rubberman

retour
xxsadmin
xxsadmin 01.07.2011 um 10:16:54 Uhr
Goto Top
Hallo rubberman,

Manchmal frag ich mich wie Ihr Jungs sowas hinbekommt. Ich hätte nie und nimmer die Lösung gefunden.

Auf jeden Fall funktioniert die Abfrage unter XP und Windows 7.

Nochmal vielen dank.

mfg
xxsadmin
rubberman
rubberman 01.07.2011 um 18:34:01 Uhr
Goto Top
Hallo zusammen.

Zitat von @60730:
Hab ich ihm abgenommen
tuts (wie zu erwarten war)
... doppelt hält auch besser face-wink

Zitat von @xxsadmin:
Manchmal frag ich mich wie Ihr Jungs sowas hinbekommt. Ich hätte nie und nimmer die Lösung gefunden.
Man bekommt das hin, indem man sich von innen nach außen vorarbeitet:
- erst sehen was das reg query ausspuckt
- mit findstr die relevanten Zeilen ausfiltern
- in der for Schleife den richtigen Teilstring in die Laufvariable packen
- die gleiche Prozedur für beide Schleifen
Versuch's mal nachzuvollziehen face-smile

Zitat von @xxsadmin:
Nochmal vielen dank.
Nicht der Rede wert.

Grüße
rubberman