suvv7777
Goto Top

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. face-smile 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

Content-Key: 148101

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

Printed on: April 24, 2024 at 20:04 o'clock

Member: Biber
Biber Aug 02, 2010 at 09:06:40 (UTC)
Goto Top
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:
  • 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
Member: suvv7777
suvv7777 Aug 02, 2010 at 09:35:42 (UTC)
Goto Top
Zitat von @Biber:

willkommen im Forum.

Danke sehr! face-smile


OK, dann hole ich kurz aus. Wir benutzen hier Terminal Server mit Citrix und die User bekommen alle Applikationen vom Citrix Server gepublisht. Dummerweise ist bei der Installation von Office auf dem Server ein Fehler passiert. In der Shadow-Registry steht bei der User-Info von Office nun leider Administrator, was dazu geführt hat, dass dies bei jedem User übernommen wurde. Mein Ziel ist also ein Logon-Script mit folgendem Inhalt:

- Steht "Administrator" in der UserInfo > Mach das weg, das ist doof. (Der User wird dann beim nächsten Word/Excel/Whatever starten einmalig nach seinem Namen und den Initialien gefragt, was aber kein Problem ist.)
- Steht nicht Administrator drin, ist es gut, denn es kann dann nur der vom User eingegebene Name sein (bzw. der Anmeldename, weil die meisten User bei der Abfrage einfach "OK" klicken, was aber ok ist.)
- Ist der Key nicht vorhanden, hat sich der User vermutlich bereits einmal angemeldet, aber danach kein Office gestartet, was ok ist.

Ich hoffe, ich konnte verständlich machen, worum es geht. face-smile

Der Key selber ist also HKCU\Software\Microsoft\Office\11.0\Common\UserInfo\UserName

Und der Wert geht über vier Zeilen, falls ich dich richtig verstehe. Der Wert sieht ungefähr so aus:

0000 41 00 64 00 6D 00 69 00 A.d.m.i.0008 6E 00 69 00 73 00 74 00 n.i.s.t.0010 72 00 61 00 74 00 6F 00 r.a.t.o.0018 72 00 00 00 r...

Ich frage mich gerade, warum das unbedingt ein REG_BINARY sein muss, aber nungut. MS halt. face-smile
Member: Biber
Biber Aug 02, 2010 at 10:09:57 (UTC)
Goto Top
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]
>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
Member: suvv7777
suvv7777 Aug 02, 2010 at 13:01:47 (UTC)
Goto Top
Hi Biber,

danke für deine Hilfe. Also ich bin mir ziemlich sicher, dass wir hier tatsächlich nur den Fall haben, dass in den HKCU "A.d.m.i.n.i.s.t.r.a.t.o.r." drin steht. Mir ist zumindest bei schon einigen angesehen Beispielen nichts gegenteiliges aufgefallen. Der von dir beschriebene Weg bringt mir tatsächlich exakt den String aus dem REG_BINARY Wert. Also wenn ich dich richtig verstehe, funktioniert das nun "simpel" mit native Batch.

>Und den kannst du natürlich auch gegen deinen "Administrator in REG_BINARY geschrieben" vergleichen.

Da ich leider das von dir angesprochene Tutorial nicht gefunden habe, mal ganz dumm gefragt: Wie funktioniert das?

Und auch auf die Gefahr hin, mich tödlich zu blamieren: Ungefähr so?

IF "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Common\UserInfo\UserName" == "410064006D0069006E006900730074007200610074006F0072000000" REG DELETE "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Common\UserInfo\UserName"
Member: Biber
Biber Aug 02, 2010 at 13:31:27 (UTC)
Goto Top
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:
:: ---- 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
Mitglied: 60730
60730 Aug 02, 2010, updated at Oct 18, 2012 at 16:43:01 (UTC)
Goto Top
Member: suvv7777
suvv7777 Aug 03, 2010 at 11:30:36 (UTC)
Goto Top
Moin Biber,

Sorry, die einzige Anleitung bei Batch & Shell, die ich mit registries finde, behandelt das auslesen ebendieser ohne reg.exe. Und der Link von Dr. House ;) hilft mir leider auch nicht so sehr.

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.

Ich teste gerade an meinem Laptop, d.h. ich habe den String getauscht gegen den meinem Wert entsprechenden String. Aber daran kann es imho ja nicht liegen. Hat vielleicht noch jemand eine Idee oder einen Hinweis, was ich noch testen könnte?
Mitglied: 60730
60730 Aug 03, 2010 at 13:25:08 (UTC)
Goto Top
Zitat von @suvv7777:
Und der Link von Dr. House ;) hilft mir leider auch nicht so sehr.

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
..steht da nun böse böse weißt du, dass du beim übernehmen von Bibers code etwas verändert hast.
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 face-wink
Member: Biber
Biber Aug 03, 2010 at 14:16:08 (UTC)
Goto Top
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:
:: ---- 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 die 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.
  • 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
Member: suvv7777
suvv7777 Aug 04, 2010 at 12:01:22 (UTC)
Goto Top
Hi Biber & Timo,

vielen vielen Dank für Eure Mühen, Biber, dein letzter Absatz hat mich allerdings nachdenklich gemacht und jetzt habe ich mal einen anderen Ansatz mir überlegt. Da das auslesen dieser REG_BINARY K*cke scheinbar die Achillesverse des ganzen ist, habe ich mir folgendes überlegt:

Das Problem hat hier jeder User. Das heißt also, dass bei jedem User einmal der entsprechende Key gelöscht werden muss. Jetzt habe ich das ganze folgendermaßen gebaut:

if exist "%userprofile%"\flag.txt goto weiter  
REG DELETE "HKCU\Software\Microsoft\Office\11.0\Common\UserInfo" /v "Username" /f  
echo "UserInfo bereinigt">"%userprofile%"\flag.txt  
:weiter

Ich setze also ein Flag in das User-Profile, dessen Existenz jedesmal überprüft wird. Der Key wird also nur gelöscht, wenn das Script noch nie ausgeführt wurde. In zwei oder drei Monaten, wenn sich jeder mindestens einmal angemeldet hat, entferne ich den Code wieder aus dem Logon-Script und alle sind glücklich. Hoffentlich. Gibt es Einwände? face-smile
Member: Biber
Biber Aug 04, 2010 at 13:58:48 (UTC)
Goto Top
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
  • 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
Mitglied: 60730
60730 Aug 04, 2010 at 22:36:14 (UTC)
Goto Top
Zitat von @Biber:
Moin suvv7777,

das finde ich vom Ansatz her schon praktikabler.

Es bleiben aber noch zwdrei Fälle übrig, in denen....hm... auf Optimierungspotential geprüft werden könnte.

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 face-wink

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ß
Member: suvv7777
suvv7777 Aug 05, 2010 at 16:15:44 (UTC)
Goto Top
Hi ihr beiden!

also ich fange mal an eure Fälle abzuarbeiten: ;)

Fall A: Kein Problem, es legt sich alles zur Not wieder vernünftig an. Habe das nun ausreichend getestet.
Fall B: Kann eigentlich nicht sein. face-smile Und wenn doch, dann wird es bei vereinzelten Usern auftreten, so dass es zur Not manuell korrigiert werden kann.
Fall C: Kann nicht vorkommen: Erstens haben wir keine rothaarigen Praktikantinnen und zweitens habe ich die Default Terminal Server Registry (aus der sich neue Nutzer unter Citrix standardmäßig ihre HKCU ziehen und wo der böse böse Wert überhaupt erst herkam) bereits entsprechend angepasst. face-wink

Nochmals vielen Dank für die HIlfe! Ich habe mal wieder sehr viel gelernt.