quba
Goto Top

Reg query, Schlüsselname eines zu suchenden Wertes herausfinden

Hallo zusammen,

ich bräuchte einen kleinen Denkanstoß bzw. Hilfe.

Es geht um ein Batch-Skript:
Ich suche in der registry nach einem bestimmten Wert und möchte den Schlüsselname als Rückgabe
erhalten der diesen Wert beinhaltet.

Leider bekomme ich das mit einem reg query in einer FOR /F Schleife nicht ganz hin.

Ich habe es hiermit versucht, aber so bekomme ich nur den gesuchten Wert (%wert%) angezeigt
nicht aber den Schlüsselnamen in dem dieser vorkommt.

@echo OFF

setlocal ENABLEEXTENSIONS
set KEY_NAME=HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676
set VALUE_NAME=Account Name
set wert=4D006900630072006F0073006F00660074002000450078006300680061006E00670065000000

For /F "tokens=4 delims=	 " %%i in ('REG QUERY "%KEY_NAME%" /s /v "%VALUE_NAME%" ^| findstr /i "%wert%"')  Do (   

 echo %%i  
)

Ich hoffe mein Problem verständlich beschrieben zu haben.

Vielen Dank für Eure Hilfe

mfg
quba

Content-ID: 201458

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

Ausgedruckt am: 22.11.2024 um 05:11 Uhr

DerWoWusste
DerWoWusste 08.02.2013 um 15:14:07 Uhr
Goto Top
Hi.

Schau Dir mal Bastlas Lösung hier an: Registry-OP per Skript - Zweig mit bestimmtem Inhalt löschen - sollte bei Dir abgewandelt anwendbar sein.
quba
quba 08.02.2013 aktualisiert um 16:04:54 Uhr
Goto Top
Hi,

danke dafür.
Leider werde ich daraus nicht ganz schlau oder schaffe es irgendwie nicht das richtig auf meine Bedürftnisse anzupassen face-confused


update:
Nach Anpassung bekomme ich leider nur genau meinen Ausgangsschlüssel zurück, nicht den untergeordneten in dem der gesuchte Wert ist..
DerWoWusste
DerWoWusste 08.02.2013 um 16:06:47 Uhr
Goto Top
Ok... ich schätze, Bastla kann und wird Dir helfen...warte nur ein Weilchen.
Ich bin da auch eher mittel talentiert.
quba
quba 08.02.2013 um 16:07:37 Uhr
Goto Top
Trotzdem danke für deine Bemühungen bzw. deinen Hinweis!
bastla
bastla 08.02.2013 um 16:43:39 Uhr
Goto Top
Hallo quba!

Wie DWW schon sagte, sollte eigentlich der Ansatz aus dem verlinkten Thread auch hier passen - etwa so:
@echo OFF & setlocal
set "KEY_NAME=HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676"  
set "VALUE_NAME=Account Name"  
set "wert=4D006900630072006F0073006F00660074002000450078006300680061006E00670065000000"  

for /f "delims=" %%a in ('reg query "%KEY_NAME%"') do (  
    if not defined Done for /f "delims=" %%b in ('reg query "%%a" 2^>nul') do (  
        if not defined Done for /f "delims=" %%c in ('reg query "%%b" 2^>nul') do (  
            if not defined Done reg query "%%c\" /s 2>nul|findstr /ic:"%VALUE_NAME%">nul && (echo "%%c" & set Done=true)  
        )
    )
)
Grüße
bastla
quba
quba 08.02.2013 aktualisiert um 17:03:52 Uhr
Goto Top
Hallo bastla,

vielen Dank für deine schnelle Hilfe.

Leider funktioniert das so nicht. Wenn ich das Script so ausführe (nach Änderung der Zeile 9 -> |findstr /ic:"%wert%" - Da ich ja nach diesem Wert suchen möchte) erscheint keine Ausgabe...

Grüße
quba

edit:
Zusätzlich habe ich auch noch im letzten query den Backslash entfernt (reg query "%%c" /s )
Dann erhalte ich den Registry Key komplett jedoch nicht den richtigen Schlüssel...

"HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676"

aber es müsste eigentlich sein:

"HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000001"
(unter diesem Schlüssel ist der gesuchte Wert: "Account Name=4D0069.......)
bastla
bastla 08.02.2013 um 17:13:21 Uhr
Goto Top
Hallo quba!

Wenn es nur eine Unterschlüsselebene gibt (anderenfalls bitte Dein Ergebnis von
reg query "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676" /s
posten), sollte sich das noch kürzer (und genauer) formulieren lassen:
@echo OFF & setlocal
set "KEY_NAME=HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676"  
set "VALUE_NAME=Account Name"  
set "wert=4D006900630072006F0073006F00660074002000450078006300680061006E00670065000000"  

for /f "delims=" %%a in ('reg query "%KEY_NAME%"') do (  
    if not defined Done for /f "delims=" %%c in ('reg query "%%a\" 2^>nul') do (  
        if not defined Done reg query "%%c\" /s 2>nul|findstr /ic:"%VALUE_NAME%"|findstr /ic:"%wert%">nul && (echo "%%c" & set Done=true)  
    )
)
Bei meinem Test (mit einem %wert%, der bei mir existiert) war das Ergebnis jedenfalls
"HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messagin
g Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000001"
Grüße
bastla
quba
quba 08.02.2013 aktualisiert um 17:23:03 Uhr
Goto Top
Hallo bastla,

es kann mehrere Unterschlüssel geben
00000001
00000002
00000...
...

In meinem Fall sieht der ausgeführte Befehl

reg query "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676" /s

so aus:

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging
 Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676
    {ED475418-B0D6-11D2-8C3B-00104B2A6676}    REG_BINARY    02000000
    LastChangeVer    REG_BINARY    2100000000000000
    {ED475419-B0D6-11D2-8C3B-00104B2A6676}    REG_BINARY    01000000
    {ED475420-B0D6-11D2-8C3B-00104B2A6676}    REG_BINARY    0200000004000000
    NextAccountID    REG_DWORD    0x5

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging
 Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000001
    clsid    REG_SZ    {ED475414-B0D6-11D2-8C3B-00104B2A6676}
    Mini UID    REG_DWORD    0x7255aa70
    Service Name    REG_BINARY    43004F004E005400410042000000
    Service UID    REG_BINARY    248C708FAA47C54A94559270DF02F79C
    MAPI Provider    REG_DWORD    0x2
    Account Name    REG_BINARY    4F00750074006C006F006F006B002D0041006400720065
007300730062007500630068000000
    New Signature    REG_BINARY    430049002D005300690067006E000000
    Reply-Forward Signature    REG_BINARY    430049002D005300690067006E000000
    XP Capabilities    REG_DWORD    0x1

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging
 Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002
    clsid    REG_SZ    {ED475414-B0D6-11D2-8C3B-00104B2A6676}
    Mini UID    REG_DWORD    0x8efe7c46
    Service Name    REG_BINARY    4D00530045004D0053000000
    Service UID    REG_BINARY    85571667B323CC438A5520AFE99AF64C
    MAPI Provider    REG_DWORD    0x5
    Identity Eid    REG_BINARY    00000000DCA740C8C042101AB4B908002B2FE182010000
00000000002F4F3D43484F504152442F4F553D4249524B454E46454C442F434E3D52454349504945
4E54532F434E3D4B55424154534348454B4D393939333131363200
    XP Status    REG_DWORD    0x1
    XP Capabilities    REG_DWORD    0x2
    XP Provider UID    REG_BINARY    7D5ABD5B7CAF8A43BC336ACC42938C94FD40527BF1F
A78478113DD08775EB56A
    Account Name    REG_BINARY    4D006900630072006F0073006F00660074002000450078
006300680061006E00670065000000
    New Signature    REG_BINARY    6B00750062006100740073006300680065006B006D000
000
    Reply-Forward Signature    REG_BINARY    28006F0068006E00650029000000

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging
 Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000004
    clsid    REG_SZ    {ED475414-B0D6-11D2-8C3B-00104B2A6676}
    Mini UID    REG_DWORD    0xc9e004c4
    Service Name    REG_BINARY    450056004D00530050000000
    Service UID    REG_BINARY    AE7ECCF1D8F03D4ABB454441E5D070E1
    MAPI Provider    REG_DWORD    0x4
    Account Name    REG_BINARY    5600610075006C00740020002D0020004B007500620061
00740073006300680065006B002C0020004D00690063006800610065006C000000

Danke und Gruß

Gruß
quba
bastla
bastla 08.02.2013 um 17:27:58 Uhr
Goto Top
Hallo quba!
es kann mehrere Unterschlüssel geben
Klar (sonst müsste ja nicht nach dem richtigen gesucht werden face-wink), aber diese befinden sich alle auf einer Ebene (also direkt unter "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676") und nicht tiefer verschachtelt - daher sollte mein zweiter Vorschlag eigentlich passen ...

Grüße
bastla
quba
quba 08.02.2013 aktualisiert um 18:01:23 Uhr
Goto Top
Hallo bastla,

das ist so nicht richtig, der gesuchte Wert "Account Name" befindet sich in diesem Fall im Unterschlüssel "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\0000002"
Genau diesen suche ich damit ich damit weiter arbeiten kann.... face-smile

Grüße
quba
bastla
bastla 08.02.2013 aktualisiert um 23:37:28 Uhr
Goto Top
Hallo quba!
das ist so nicht richtig, der gesuchte Wert "Account Name" befindet sich in diesem Fall im Unterschlüssel
Ich hab ja auch nix anderes behauptet (sondern nur gesagt, dass die Unterschlüssel nicht noch weiter verschachtelt, sondern alle auf einer Ebene sind) ...

... und, wie gesagt, bei meinem Test mit diesem Ansatz klappt's auch mit dem Wunschergebnis - und wie ist das bei Dir, hast Du das überhaupt schon getestet?

Eine andere Variante könnte übrigens so aussehen:
@echo off & setlocal enabledelayedexpansion
set "KEY_NAME=HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676"  
set "VALUE_NAME=Account Name"  
set "wert=4D006900630072006F0073006F00660074002000450078006300680061006E00670065000000"  

for /f "delims=" %%a in ('reg query "%KEY_NAME%" /s ^|findstr /i "HKEY_CURRENT_USER %wert%"') do (  
    if not defined TheKey (
        echo "%%a"|findstr /i "HKEY_CURRENT_USER">nul && set "Key=%%a"  
        echo "%%a"|findstr /ic:"%VALUE_NAME%"|findstr /ic:"%wert%">nul && set "TheKey=!Key!"  
    )
)
if not defined TheKey echo Nicht gefunden! & pause & goto :eof
echo "%TheKey%"  
Grüße
bastla
quba
quba 09.02.2013 aktualisiert um 13:40:48 Uhr
Goto Top
Hi bastla,

klar hab ich deinen vorhergehenden Vorschlag ausprobiert,
jedoch wie schon erwähnt, hatte ich damit keinen Erfolg.

Mit deinem letzten Code jedoch funktioniert es jetzt wie gewünscht!

Vielen herzlichen Dank für deine Hilfe und Bemühungen!
Es lohnt sich doch immer wieder hier um Rat zu fragen, hier sind Profis am Werk face-wink

Wünsche ein schönes Wochenende!

Grüße
quba