Registry-Key per Batch löschen, falls er XYZ lautet?
Guten Tag! Dies ist mein erster Beitrag hier, da ich mich nun doch tatsächlich hier angemeldet habe. Benutzen tue ich dieses Forum schon sehr lange und zahlreiche Beiträge und Anleitungen haben mir schon weitergeholfen. Jetzt bin ich aber leider vorerst am Ende mit meinem Latein, aber ich bin sicher, dass man mir hier weiterhelfen kann. Also los:
Hallo zusammen,
ich stehe momentan vor einem Problem, zu welchem ich leider trotz intensiver administrator.de Lektüre noch keine Lösung gefunden habe.
Es geht um folgendes: Ich möchte gerne ein batch-Script erstellen, was abfragt, ob ein bestimmter Registry Key den Wert XYZ hat und wenn dem so ist, soll der Key gelöscht werden, aber auch nur dann. Leider bin ich recht unerfahren, was Batch-Skripte angeht, würde mich über eine Hilfestellung also sehr freuen.
Und dann in dem Zusammenhang noch eine (wahrscheinlich absolute Noob-)Frage: Der entsprechende Key ist ein REG_BINARY. Ich müsste also in das Script den HEX-Wert davon eingeben, ja? Mit Leerzeichen?
Ich danke schon jetzt für eure Antworten und hoffe, mich nicht vollkommen blamiert zu haben.
LG,
suvv7777
Hallo zusammen,
ich stehe momentan vor einem Problem, zu welchem ich leider trotz intensiver administrator.de Lektüre noch keine Lösung gefunden habe.
Es geht um folgendes: Ich möchte gerne ein batch-Script erstellen, was abfragt, ob ein bestimmter Registry Key den Wert XYZ hat und wenn dem so ist, soll der Key gelöscht werden, aber auch nur dann. Leider bin ich recht unerfahren, was Batch-Skripte angeht, würde mich über eine Hilfestellung also sehr freuen.
Und dann in dem Zusammenhang noch eine (wahrscheinlich absolute Noob-)Frage: Der entsprechende Key ist ein REG_BINARY. Ich müsste also in das Script den HEX-Wert davon eingeben, ja? Mit Leerzeichen?
Ich danke schon jetzt für eure Antworten und hoffe, mich nicht vollkommen blamiert zu haben.
LG,
suvv7777
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 148101
Url: https://administrator.de/contentid/148101
Ausgedruckt am: 25.11.2024 um 11:11 Uhr
13 Kommentare
Neuester Kommentar
Moin suvv7777,
willkommen im Forum.
Vor dem Reinklimpern von irgendetwas in die Tastatur sollten wir erst nochmal die Wahl des Werkzeugs diskutieren.
Wenn es ein REG_BINARY ist, kann es vollkommen unproblematisch für einen Batch sein -- falls dieser Wert "0100" lautet oder auch "B9CD78528929EE46B0F992D799DFA286". Denn beides würde in eine per "REG QUERY" abgefragte Zeile passen.
Aber ein REG_BINARY kann auch (in der Anzeige/Ausgabe) über mehrere Zeilen gehen... dann ist Batch/Reg-Query kein sinnvolles Werkzeug.
Deshal die Rückfragen:
Bei REG_BINARY-Werten würde ich jedenfalls eher VBSkript empfehlen.
Zum anderen verstehe ich den Ablauf nicht ganz.
Grüße
Biber
willkommen im Forum.
Vor dem Reinklimpern von irgendetwas in die Tastatur sollten wir erst nochmal die Wahl des Werkzeugs diskutieren.
Wenn es ein REG_BINARY ist, kann es vollkommen unproblematisch für einen Batch sein -- falls dieser Wert "0100" lautet oder auch "B9CD78528929EE46B0F992D799DFA286". Denn beides würde in eine per "REG QUERY" abgefragte Zeile passen.
Aber ein REG_BINARY kann auch (in der Anzeige/Ausgabe) über mehrere Zeilen gehen... dann ist Batch/Reg-Query kein sinnvolles Werkzeug.
Deshal die Rückfragen:
- ist es ein abstrakter oder ein konkreter Key, um den es dir jetzt geht und von dem du weisst, welche Dimensionen er hat (wenn er mit deinem Suchstring übereinstimmen soll)?
- Oder simpler - wie lautet denn der Vergleichsstring "XYZ" in der Realität?
Bei REG_BINARY-Werten würde ich jedenfalls eher VBSkript empfehlen.
Zum anderen verstehe ich den Ablauf nicht ganz.
- Wenn Key NICHT vorhanden... dann isses okay, sagst du. Versteh ich.
- Wenn Key vorhanden und gleich "XYZ", dann böse---> löschen. Versteh ich.
- wenn Key vorhanden und gleich "ABC" (oder auch "ABC;XYZ"? ), dann banane ->keine Aktion? Versteh ich nicht.
Grüße
Biber
Moin suvv7777,
okay, in diesem Fall (da der Username nicht wirklich richtig lang werden kann, könnte es evtl stressarm gehen.
Probiere es mal selbst an einem CMD-Fenster aus
[Demo am CMD-Prompt; das führende ">" NICHT mit eingeben, ist Teil des Prompts]
Wenn du dann die Variable "DerUsername" anzeigen lässt mit "Echo %DerUsername% bekommst du den vollständigen String.
Und den kannst du natürlich auch gegen deinen "Administrator in REG_BINARY geschrieben" vergleichen.
Was sich meiner Kenntnis entzieht ist allerdings, ob es in dieser PraktikantInnen-Kruschkiste namens Registry auch ebenso passieren kann, dass dort statt "A.d.m.i.n.i.s.t.r.a.t.o.r." vielleicht auch "a.d.m.i.n.i.s.t.r.a.t.o.r." oder "A.D.m.i.n.i.S.T.R.A.T.O.r." stehen kann (erlaubterweise und mit gleicher Bedeutung). Dann hast du verspielt mit native Batch.
Wenn ja -> dann müsste der BINARY-Sring doch ma' eben "in lesbar" umgewandelt werden, dann der in Kleinbuchstaben umgewandelte RegWert mit dem in Kleinbuchstaben umgewandelten Vergleichsstring "administrator" verglichen werden... ein Fall für VBSkript.
Dafür haben wir aber auch (glaube ich) ein kleines Tutorial hier "Registrywerte auslesen rauf und runter" oder so ähnlich.
Grüße
Biber
okay, in diesem Fall (da der Username nicht wirklich richtig lang werden kann, könnte es evtl stressarm gehen.
Probiere es mal selbst an einem CMD-Fenster aus
[Demo am CMD-Prompt; das führende ">" NICHT mit eingeben, ist Teil des Prompts]
>for /f "tokens=3" %i in ('reg query "HKCU\Software\Microsoft\Office\11.0\Common\userInfo" /v Username') do @Set "DerUsername=%i"
Wenn du dann die Variable "DerUsername" anzeigen lässt mit "Echo %DerUsername% bekommst du den vollständigen String.
Und den kannst du natürlich auch gegen deinen "Administrator in REG_BINARY geschrieben" vergleichen.
Was sich meiner Kenntnis entzieht ist allerdings, ob es in dieser PraktikantInnen-Kruschkiste namens Registry auch ebenso passieren kann, dass dort statt "A.d.m.i.n.i.s.t.r.a.t.o.r." vielleicht auch "a.d.m.i.n.i.s.t.r.a.t.o.r." oder "A.D.m.i.n.i.S.T.R.A.T.O.r." stehen kann (erlaubterweise und mit gleicher Bedeutung). Dann hast du verspielt mit native Batch.
Wenn ja -> dann müsste der BINARY-Sring doch ma' eben "in lesbar" umgewandelt werden, dann der in Kleinbuchstaben umgewandelte RegWert mit dem in Kleinbuchstaben umgewandelten Vergleichsstring "administrator" verglichen werden... ein Fall für VBSkript.
Dafür haben wir aber auch (glaube ich) ein kleines Tutorial hier "Registrywerte auslesen rauf und runter" oder so ähnlich.
Grüße
Biber
Moin suvv7777,
ja, ungefähr so.... sinngemäß war es richtig.
-> schau bitte nochmal im Bereich "Batch & Shell" die paar "Anleitungen" durch... da muss eine dabei sein, die mit "Registrywerten" zu tun hat.
Als Skizze (bin gerade etwas im Stress hier) SINNGEMÄSS:
[Absolut ungetestet und nur leicht kommentiert....]
Grüße
Biber
ja, ungefähr so.... sinngemäß war es richtig.
-> schau bitte nochmal im Bereich "Batch & Shell" die paar "Anleitungen" durch... da muss eine dabei sein, die mit "Registrywerten" zu tun hat.
Als Skizze (bin gerade etwas im Stress hier) SINNGEMÄSS:
:: ---- DeinBatchname.cmd.
@echo off & setlocal
Set "DerRegZweig="HKCU\Software\Microsoft\Office\11.0\Common\UserInfo"
Set "DerRegKey=UserName"
Set "dasGefundene=NochNix"
Set "dasBoese=410064006D0069006E006900730074007200610074006F0072000000"
:: --- jetzt den Registrywert lesen
:: -- Fehlermeldungen wie "nicht gefunden" oder "keine Leserechte"... fange ich hier nicht ab.
FOR /f "tokens=3" %%i in (
'reg query "%DerRegZweig%" /v %derRegKey% ^|FindStr "BINARY" '
) do @Set "DasGefundene=%%i"
:: fertig mit Lesen... jezz' vergleichen
:: Wenn Übereinstimmung -> Hau wech den Mist
:: Sonst Halt gar nix tun wie die Tigerenten.
IF "%DasGefundene%" == "%dasBoese%" (
REG DELETE "%derRegZweig%" /v %derRegkey% /f
)
[Absolut ungetestet und nur leicht kommentiert....]
Grüße
Biber
moin,
schau bitte nochmal im Bereich "Batch & Shell" die paar "Anleitungen" durch... da muss eine dabei sein, die mit "Registrywerten" zu tun hat.
Du meinst mein "on error resume next" *gg*
Gruß
schau bitte nochmal im Bereich "Batch & Shell" die paar "Anleitungen" durch... da muss eine dabei sein, die mit "Registrywerten" zu tun hat.
Du meinst mein "on error resume next" *gg*
Gruß
Naja der ist aber (ok vbs) genau das, was du eigentlich brauchst - also nicht nur das "kicken" des falschen Wertes, sondern gleich den richtigen hinschreiben.
Ich habe aber mit deinem Code jetzt mal getestet und habe tatsächlich das Problem, dass der Key nicht gefunden werden kann.
Beim Auslesen des Registry-Wertes kommt die Meldung Fehler: Der angegebene Registrierungsschlüssel oder Wert konnte nicht
gefunden werden.
..dann mach doch folgendes"
entweder nimmst du dem Bibers code die ersten beiden Befehle weg @echo off und läßt nur das setlocal drin oder:
reg query "HKCU\Software\Microsoft\Office\11.0\Common\UserInfo" /v "Username" |find "410064006D0069006E006900730074007200610074006F0072000000" && echo böse böse
pause
Nimmst du jetzt anstatt echo böse böse (das du sehen solltest - denn bei Office 2003 ist das der Wert, der für die Userinfo zuständig ist)
reg query "HKCU\Software\Microsoft\Office\11.0\Common\UserInfo" /v "Username" |find "410064006D0069006E006900730074007200610074006F0072000000" && REG DELETE "HKCU\Software\Microsoft\Office\11.0\Common\UserInfo" /v "Username" /f
Hast du mehr oder weniger das gleiche wie das Script vom Biber, aber kürzer und in dem Fall machts ja nix, wenn alles "hart" und nicht weich per Paramter vedrahtet ist.
Gruß
btw:
Dass ich mal einen kürzeren Code als Meister der Einzeiler Biber hier postet - das kreuz ich in meinem nicht vorhandenen Kalender an
Moin suvv7777 und T-Mo,
ja, wir machen den Code etwas schlanker... und versuchen, ihn selbstdokumentierend und wartbar zu halten.
Das sieht dann so aus:
Dann sind wenigstens die tippfehlerträchtigen Klamotten an EINER Stelle im Code.
Und formal haben wir das Soll erfüllt - wenn unterhalb von HKCU...Office2003...bla "Administrator" steht, dann löschen wir den Key.
[ Wenn wir ihn nicht lesen dürfen... tja, dann können wir auch nicht löschen.
Wenn der "Administrator" zufällig unter unter "HKCU...Office2000..bla" steht... tja - prüfen und merken wir nicht.
Works as designed.]
@suvv7777
Mit dem Registry-Tutorial dachte ich schon an das von dir gefundene... ja, auch wenn es heißt "Registry ohne REG.exe bearbeiten".
Die FOR /F-Mimik istdie gleiche Sosse. das gleiche Vorgehen.
BTW. Wie kommst du denn auf die Idee, das T-Mo ein Doktor wäre?
Weil er manchmal so schreibt wie die anderen Männer in den weissen Kitteln auf Rezepten? *gg
Nichtsdestotrotz:
- Der Scriptschnipsel hat schon -selbst für einen Batch- ein eher lockeres Verständnis von Qualität und Nachvollziehbarkeit.
Du solltest also MINIMAL an zwei, drei befreundeten Clientbüchsen probelaufen lassen.
Wenigstens um zu prüfen, ob nicht jedesmal der Fehler kommt "Reg.exe - Zugriff verweigert" oder jedesmal "Pfad nicht gefunden".
Der Fall "Registry-Wert gefunden, ist aber nicht "(binary)Administrator"" dagegen ist ja kein "Fehlerfall", sondern ein Prüfergebnis.
Grüße
Biber
ja, wir machen den Code etwas schlanker... und versuchen, ihn selbstdokumentierend und wartbar zu halten.
Das sieht dann so aus:
:: ---- DeinSchlankererBatch.cmd
@echo off & setlocal
Set "DerRegZweig="HKCU\Software\Microsoft\Office\11.0\Common\UserInfo"
Set "DerRegKey=UserName"
Set "dasBoese=410064006D0069006E006900730074007200610074006F0072000000"
:: --- jetzt den Registrywert lesen
:: -- Fehlermeldungen wie "nicht gefunden" .. leite ich.nach dahin, wo unsere Rente schon ist
reg query "%DerRegZweig%" /v %derRegKey% ^2^>NUL ^|FindStr "%dasBoese%" && REG DELETE "%derRegZweig%" /v %derRegkey% /f
:: Wenn Übereinstimmung -> Hau wech den Mist... Sonst unauffällig weiterregieren wie die Tigerenten.
Dann sind wenigstens die tippfehlerträchtigen Klamotten an EINER Stelle im Code.
Und formal haben wir das Soll erfüllt - wenn unterhalb von HKCU...Office2003...bla "Administrator" steht, dann löschen wir den Key.
[ Wenn wir ihn nicht lesen dürfen... tja, dann können wir auch nicht löschen.
Wenn der "Administrator" zufällig unter unter "HKCU...Office2000..bla" steht... tja - prüfen und merken wir nicht.
Works as designed.]
@suvv7777
Mit dem Registry-Tutorial dachte ich schon an das von dir gefundene... ja, auch wenn es heißt "Registry ohne REG.exe bearbeiten".
Die FOR /F-Mimik ist
BTW. Wie kommst du denn auf die Idee, das T-Mo ein Doktor wäre?
Weil er manchmal so schreibt wie die anderen Männer in den weissen Kitteln auf Rezepten? *gg
Nichtsdestotrotz:
- Der Scriptschnipsel hat schon -selbst für einen Batch- ein eher lockeres Verständnis von Qualität und Nachvollziehbarkeit.
- es ist nicht nachvollziehbar, ob er überhaupt irgendwo irgendwann auf einem (Client-)Rechner gelaufen ist oder nicht
- und auch nicht mit welchem Ergebnis -sei es mit Erfolg oder einen auf die Schnauze bekommen
- der Schnipsel ist durch diesen Tunnelblick auf Office-Version 2003 so unflexibel wie meine Ex-Schwiegermutti.
Du solltest also MINIMAL an zwei, drei befreundeten Clientbüchsen probelaufen lassen.
Wenigstens um zu prüfen, ob nicht jedesmal der Fehler kommt "Reg.exe - Zugriff verweigert" oder jedesmal "Pfad nicht gefunden".
Der Fall "Registry-Wert gefunden, ist aber nicht "(binary)Administrator"" dagegen ist ja kein "Fehlerfall", sondern ein Prüfergebnis.
Grüße
Biber
Moin suvv7777,
das finde ich vom Ansatz her schon praktikabler.
Es bleiben aber noch zwei Fälle übrig, in denen....hm... auf Optimierungspotential geprüft werden könnte.
Fall a)
Es ist bei dem Client-User noch nie gelaufen (Flag.txt jibbet nicht)
ABER es steht bereits der richtige USERNAME in der Registry.
Der wird dann umsonst gelöscht-> nicht schlimm, WENN er denn immer ohne Probleme neu angelegt wird.
Fall b)
Der Böse-böse-Wert "(binary)Administrator" steht in der Registry, das Skript ist noch nie gelaufen und versucht das "reg Delete".
Und bekommt einen aufs Maul, weil Reg.exe nicht vorhanden oder Zugriff auf Reg.exe verweigert...
Dann steht nach dem Lauf des Skripts immer noch der Böse-böse-Wert in der Registry, aber das Flag.txt existiert.
Falls der zweite Fall bei euch vorkommen kann, dann solltest du
Grüße
Biber
das finde ich vom Ansatz her schon praktikabler.
Es bleiben aber noch zwei Fälle übrig, in denen....hm... auf Optimierungspotential geprüft werden könnte.
Fall a)
Es ist bei dem Client-User noch nie gelaufen (Flag.txt jibbet nicht)
ABER es steht bereits der richtige USERNAME in der Registry.
Der wird dann umsonst gelöscht-> nicht schlimm, WENN er denn immer ohne Probleme neu angelegt wird.
Fall b)
Der Böse-böse-Wert "(binary)Administrator" steht in der Registry, das Skript ist noch nie gelaufen und versucht das "reg Delete".
Und bekommt einen aufs Maul, weil Reg.exe nicht vorhanden oder Zugriff auf Reg.exe verweigert...
Dann steht nach dem Lauf des Skripts immer noch der Böse-böse-Wert in der Registry, aber das Flag.txt existiert.
Falls der zweite Fall bei euch vorkommen kann, dann solltest du
- Wenn kein Flag.txt existiert (du also im Mach-Was-Zweig des Schnipsels bist)
- nach dem REG DELETE
- nochmals eine Überprüfung stattfinden nicht auf einen Errorlevel, sondern auf "Gibt es JETZT noch einen Böse-böse-Wert in der Registry?"
Grüße
Biber
Zitat von @Biber:
Moin suvv7777,
das finde ich vom Ansatz her schon praktikabler.
Es bleiben aber nochzwdrei Fälle übrig, in denen....hm... auf Optimierungspotential geprüft werden könnte.
Moin suvv7777,
das finde ich vom Ansatz her schon praktikabler.
Es bleiben aber noch
Fall c)
Du klemmst den Teil aus dem Login raus und zwei Tage später bekommst du ne rothaarige Praktikantin und legst die im AD & Citrix an.
Dafür hätte ich mit Fall B eher kein Problem - hab ich schon mal kixtart als loginscripttool lobend erwähnt
if not exist "%userprofile%\flag.txt" regedit /e "%userprofile%\flag.txt" "HKCU\Software\Microsoft\Office\11.0\Common\UserInfo"
find "410064006D0069006E006900730074007200610074006F0072000000" "%userprofile%\flag.txt" || goto weiter
REG DELETE "HKCU\Software\Microsoft\Office\11.0\Common\UserInfo" /v "Username" /f
echo "UserInfo bereinigt">>"%userprofile%"\flag.txt
attrib +h "%userprofile%\flag.txt"
:weiter
ungetestet siehe @echo off
Gruß