70065
Goto Top

Registry durchsuchen, Pfad kopieren, in Variable setzen

Hallo!

Folgendes:

Ich möchte erstens mittels .bat die Registry durchsuchen.
Im Pfad "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network" soll nach Zeichenfolge "Lan-Verbindung" gesucht werden.

Entwerder soll gleich in dem gefunden Verzeiches ein neuer D-WORD Wert erstellt werden...

oder

der Pfad in dem "Lan-Verbindung" gefunden wurde soll gelesen werden und die ID davor soll als Variable definiert werden.
In meinem Fall:
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{E73A4B95-9D35-47FE-B351-C1C6DA675F37}\Connection"

Als Variable definieren: "{4D36E972-E325-11CE-BFC1-08002BE10318}\{E73A4B95-9D35-47FE-B351-C1C6DA675F37}"

Ich hoffe jemand kann mir helfen...

Danke!!!

Gruß!

Content-ID: 97861

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

Ausgedruckt am: 05.11.2024 um 08:11 Uhr

bastla
bastla 25.09.2008 um 17:30:03 Uhr
Goto Top
Hallo Shark16761!

Versuch's mal so:
@echo off & setlocal
set ID=
set "Key=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\"  
for /f %%i in ('reg query "%Key%" /s^|findstr "{" 2^>nul') do set "Key2=%%i"  
for /f "tokens=6-7 delims=\" %%i in ('reg query "%Key2%" /s^|findstr "}\\{" 2^>nul') do set "ID=%%i\%%j"  
if defined ID (
    echo %ID%
) else (
    echo Nicht gefunden ...
)
Grüße
bastla

[Edit] Suchbegriff im zweiten "findstr" auf "}\\{" geändert [/Edit]
Biber
Biber 25.09.2008 um 17:41:35 Uhr
Goto Top
wieder zu langsam...

Meine zwei Test-Zeilen vom CMD-Prompt sahen so aus:
>set "regkey=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network"  
>for /f %i in ('reg query "%regkey%" /s ^|find "}\Connection"') do @for /f "delims={} tokens=2,4" %j in ('reg query "%i" /v name ^|findstr "HKEY"') do @echo {%j}\{%k}  

... wobei sich mein Algorithmus dahingehend unterscheidet, dass ich..
  • nur den einen einzigen Subkey mit dem String-Ende "}\Connection" auslese
  • den Wert "Lan-Verbindung" im RegKey ".....\Name" unterstelle.

Grüße
Biber
bastla
bastla 25.09.2008 um 17:49:38 Uhr
Goto Top
... was sicherlich die exaktere Umsetzung ist (ich habe aber auch noch etwas bei meinem zweiten "findstr" nachgebessert face-wink).

Grüße
bastla
AndreasA
AndreasA 25.09.2008 um 18:39:56 Uhr
Goto Top
@bastla und biber

eure beiden Ansätze sind schon gut, jedoch produzieren sie nur eine Liste aller Netzwerkadapter.
Bei mir z.B. lautet die ausgabe von
@echo off & setlocal
set "regkey=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network"  
if exist %temp%\adapterlist.txt del %temp%\adapterlist.txt
for /f %%i in ('reg query "%regkey%" /s ^|find "}\Connection"') do @for /f "delims={} tokens=2,4" %%j in ('reg query "%%i" /v name ^|findstr "HKEY"') do (@echo {%%j}\{%%k})  
bei mehreren Adaptern z.B. so
{4D36E972-E325-11CE-BFC1-08002BE10318}\{03ECF24E-CFA6-470E-8778-154F50C00938} 
{4D36E972-E325-11CE-BFC1-08002BE10318}\{1D08E21B-BC59-4E5C-AE4C-E57179B178D8} 
{4D36E972-E325-11CE-BFC1-08002BE10318}\{3EBCDD6B-5657-453A-AC4B-B09B8BA231C1} 
{4D36E972-E325-11CE-BFC1-08002BE10318}\{B46C56F5-4505-4D6A-BA77-4D04AA94A840} 
{4D36E972-E325-11CE-BFC1-08002BE10318}\{BF173863-CDC8-4E35-BFF0-FB35F9EF28F0} 

Soweit ich den Fragesteller verstanden habe, sucht er aber genau den Adapter, dessen Name LAN-Verbindung
heisst und nicht etwa LAN-Verbindung 2
Daher habe ich mal biber's cmd-Version erweitert als adaptersearch.cmd
@echo off & setlocal
set "regkey=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network"  
if exist %temp%\adapterlist.txt del %temp%\adapterlist.txt
for /f %%i in ('reg query "%regkey%" /s ^|find "}\Connection"') do @for /f "delims={} tokens=2,4" %%j in ('reg query "%%i" /v name ^|findstr "HKEY"') do (@echo {%%j}\{%%k} >>%temp%\adapterlist.txt)  
for /f %%a in (%temp%\adapterlist.txt) do (reg query "%regkey%\%%a\Connection" /s  >%temp%\tmp.txt  
										   for /f "tokens=3,4" %%b in ('find "LAN-Verbindung" %temp%\tmp.txt') do (IF "LAN-Verbindung"=="%%b" (If ""=="%%c" echo %%a))  
										   del %temp%\tmp.txt											)
del %temp%\adapterlist.txt

und diese liefert mir nur genau den einzigen Adapter-Wert, den der Fragesteller sucht

Grüße AndreasA
bastla
bastla 25.09.2008 um 20:05:01 Uhr
Goto Top
@AndreasA
Du hast leider recht ... face-sad

... allerdings sollte es eigentlich auch ohne "Temp"-Dateien gehen:
@echo off & setlocal
set "regkey=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network"  
set ID=
for /f %%i in ('reg query "%regkey%" /s ^|find "}\Connection"') do (  
    for /f "tokens=2*" %%a in ('reg query "%%i" /v name ^|findstr /i "name"') do (  
	if "%%b"=="LAN-Verbindung" for /f "tokens=2,4 delims={}" %%m in ("%%i") do set "ID={%%m}\{%%n}"     
    )
)

if defined ID ( 
    echo %ID% 
) else ( 
    echo Nicht gefunden ... 
)
Grüße
bastla
AndreasA
AndreasA 26.09.2008 um 10:17:00 Uhr
Goto Top
Zitat von @bastla:
@AndreasA
Du hast leider recht ... face-sad
Wieso leider? Wir Admins sind auch nur Menschen und können mal was übersehen. Genau deshalb gibts ja dieses Forum face-wink

... allerdings sollte es eigentlich auch ohne
"Temp"-Dateien gehen:
for /f "tokens=2*" %%a in ('reg query "%%i" /v name ^|findstr /i "name"') do (  


Dafür liebe ich genau euch "Skript-Gurus" face-big-smile Aus ein paar Zeilen Code macht ihr noch weniger Zeilen. "tokens=2*" war genau der Ansatz der mir fehlte und daher nur der Umweg über Temp-Dateien.

Dangöö AndreasA
Biber
Biber 26.09.2008 um 11:20:38 Uhr
Goto Top
Moin Shark16761, bastla und AndreasA,

@AndreasA
Aus ein paar Zeilen Code macht ihr noch weniger Zeilen.
Jepp, ich habe mich gestern abend auch noch dazu verleiten lassen, aus bastlas letzter Vorlage zu einem Einzeiler zusammenzudampfen....
Geht (natürlich), aber dann ist es ganz aus mit der Les- und Wartbarkeit.
Außerdem ist bei Onelinern naturgemäß die Möglichkeit der Quellcode-Kommentierung etwas eingeschränkt. - und das wollen wir hier eigentlich nicht als erstrebenswert hochhalten.

Soll heißen:
  • nimm bastla oder mich nicht immer ganz furchtbar ernst, wenn so ein eingedampfter (funktionierender) Codeschnipsel rausfällt, der aussieht als wären wir mit dem Kopf auf der Tastatur aufgeschlagen.
  • bei den heutigen Festplatten liegt die minimale Byte-Größe, die eine Datei belegen kann, bei 16384 ... egal ob da 100 Zeichen oder 2500 oder 10000 Zeichen drinstehen
  • manchmal hat ein (wegoptimierbarer) Zwischenschritt doch den Vorteil, dass die Pflegbarkeit und Nachvollzierbarkeit erheblich steigt.

@70065
Was Du aus diesem Thread mitnehmen solltest ist, dass eigentlich die von Dir formulierte Aufgabe (ermittle aus der Registry denjenigen Reg-Schlüsselnamen, der einen Wert mit dem Text "LAN" enthält) nicht mit vertretbarem Aufwand zuverlässig und eindeutig per Batch lösbar ist.

Alle drei Lösungsansätze beruhen auf selbst getesteten/ermittelten Zusatzinformationen ( die
Stirngwerte "}\Connection", "Name",....), die gar nicht Teil der Problembeschreibung waren.
Unterm Strich heißt es: Wenn Du so ein Problem hast, MUSST Du zumindest wissen:
  • wie heißt der "Vaterknoten", unterhalb dessen gesucht werden soll (den hast du gepostet)
  • wie heißt der letzte Unterknoten (der Wert "....\Connection" )
  • Wie der Schlüsselname, dessen Wert z.B. "LAN" sein soll (oben also: "Name")

Anderfalls ist es nicht lösbar.

Grüße
Biber
70065
70065 26.09.2008 um 11:24:11 Uhr
Goto Top
Danke an alle es hat funktioniert!!!

Ja ich habe nur nach dem Adapter "Lan-Verbindung" gesucht.

Super!

Gruß
AndreasA
AndreasA 26.09.2008 um 11:50:33 Uhr
Goto Top
@Biber

Zitat von @Biber:
@AndreasA
Jepp, ich habe mich gestern abend auch noch dazu verleiten lassen,
aus bastlas letzter Vorlage zu einem Einzeiler zusammenzudampfen....
Geht (natürlich), aber dann ist es ganz aus mit der Les- und
Wartbarkeit.
Stimmt schon.
Außerdem ist bei Onelinern naturgemäß die Möglichkeit der Quellcode-Kommentierung
etwas eingeschränkt. - und das wollen wir hier eigentlich nicht als
erstrebenswert hochhalten.
Nun das hängt immer vom Bedarfsfall ab. Nicht jede Hilfs-Zusatzroutine muss ja mit Kommentar-Romanen gefüllt werden, wenn man deren Aufgabe schon kennt face-wink .
Soll heißen:
  • nimm bastla oder mich nicht immer ganz furchtbar ernst, wenn so ein eingedampfter > (funktionierender) Codeschnipsel rausfällt, der aussieht als wären wir mit dem Kopf auf der Tastatur aufgeschlagen.
face-big-smile is ja n Brüller, aber deine Art Humor hat mir schon immer gefallen. Tut gut so kurz vorm Wochenende. Und wenn ich euch nicht ernst nehmen würde, hätte ich etwa die Hälfte meiner Skripte nicht auf die Beine stellen können face-wink
* bei den heutigen Festplatten liegt die minimale Byte-Größe, die eine Datei belegen
kann, bei 16384 ... egal ob da 100 Zeichen oder 2500 oder 10000 Zeichen drinstehen
Is durchaus ein nachdenkenswertes Argument.
* manchmal hat ein (wegoptimierbarer) Zwischenschritt doch den Vorteil, dass die
Pflegbarkeit und Nachvollzierbarkeit erheblich steigt.
Daran habe ich mich bisher immer gehalten. Kann ja sein meine Skripte müssen ein paar Jahre später mal geändert werden. Ob ich da noch weiß warum ich was wie ge"-batcht" habe, wage ich jetzt schon mal zu bezweifeln. face-smile

@70065
Was Du aus diesem Thread mitnehmen solltest ist, dass eigentlich die von Dir
formulierte Aufgabe (ermittle aus der Registry denjenigen Reg-Schlüsselnamen, der
einen Wert mit dem Text "LAN" enthält) nicht mit vertretbarem Aufwand
zuverlässig und eindeutig per Batch lösbar ist.

Alle drei Lösungsansätze beruhen auf selbst getesteten/ermittelten
Zusatzinformationen ( die Stirngwerte "}\Connection", "Name",....), die gar
nicht Teil der Problembeschreibung waren.
Unterm Strich heißt es: Wenn Du so ein Problem hast, MUSST Du zumindest wissen:
  • wie heißt der "Vaterknoten", unterhalb dessen gesucht werden soll (den hast du gepostet)
  • wie heißt der letzte Unterknoten (der Wert "....\Connection" )
  • Wie der Schlüsselname, dessen Wert z.B. "LAN" sein soll (oben also: "Name")

Anderfalls ist es nicht lösbar.

Und genau solch punktgenaue Zusammenfassung von Dir sind der Grund, warum ich sehr oft hier bin --> Man kann hier wirklich was lernen face-wink
Grüße Biber
Dankbare Grüße zurück
AndreasA
AndreasA 26.09.2008 um 12:15:57 Uhr
Goto Top
Zitat von @70065:
Danke an alle es hat funktioniert!!!

Na Prima.
Ja ich habe nur nach dem Adapter "Lan-Verbindung" gesucht.

Bitte beim nächsten mal auch genauer die Problemstellung formulieren face-wink
Wobei sich für mich die Frage stellt warum du für das Modifizieren von Netzverbindungen nicht auf die betriebssystemeigene Netshell ( siehe Hilfe netsh ) zurückgreifst. Dort kannst du direkt mit dem Namen arbeiten face-wink

PS Du kannst dein Beitrag als gelöst markieren.

Gruß AndreasA
70065
70065 26.09.2008 um 13:06:50 Uhr
Goto Top
Weil ich dort nur den D-Wort Wert "ShowIcon" erstellen möchte. Damit das Netzwerksymbol im Infobereich angezeigt wird.

Gruß bis zum nächsten Mal...