minpic01.jpg

Dr. Tobias Weltner

Schatzsuche

Skripte erschließen die Windows-Registry

Dass in der Registrierdatenbank unzählige Funktionen schlummern, die man sonst nicht erreicht, hat sich längst herumgesprochen. Aber nicht jeder Anwender hat Lust, sich mit der Struktur der Registry auseinander zu setzen, geschweige denn, darin selbst Hand anzulegen. Zum Glück lassen sich mit dem Scripting Host Bedienelemente für jede noch so verborgene Windows-Einstellung nachrüsten.

Unterthema: Listing 1
Unterthema: Listing 2
Unterthema: Listing 3
Unterthema: Listing 4
Unterthema: Listing 5
Unterthema: Listing 6
Unterthema: Listing 7
Unterthema: Listing 8
Unterthema: Listing 9
Unterthema: NT-Registry: Mit List und Tücke
Unterthema: Registry sichern
Unterthema: Windows-Registrierung beobachten

Die Registry ist nichts weiter als eine Datenbank, in der Windows ständig alle möglichen Einstellungen speichert, um sie später wieder auszulesen. Jedes System-Dialogfenster und jede noch so unbedeutende Windows-Konfiguration schlägt sich in einem eigenen Eintrag nieder. Allerdings gibt es nicht für alle Einstellungen offizielle Dialoge. Ein Großteil wird autonom von Windows verwaltet, das ist zum Teil auch durchaus sinnvoll. Man findet in der Registry aber auch einige verborgene Einstellungen, welche die Arbeit mit Windows erleichtern und mehr Möglichkeiten bieten, das System nach eigenem Gusto maßzuschneidern - wenn man weiß, wo und wie.

Normalerweise ist die Arbeit mit Regedit.Exe nicht ohne: Der Editor öffnet die gesamte Datenbank und Änderungen wirken sich sofort aus, also ohne Möglichkeit, Missgeschicke ungeschehen zu machen. Von wahllosen Experimenten mit dem Registrierungseditor sei daher eindringlich gewarnt: Eine einzige falsche Einstellung an der richtigen Stelle legt das gesamte System dauerhaft lahm.

Dennoch braucht man auf die vielen Zusatzfunktionen nicht zu verzichten. Man lässt die fehlenden Dialogfenster einfach von Skripten nachrüsten: Die hier vorgestellten Beispiele schaffen einfache und sichere Bedienelemente, ohne dass beim Editieren der Datenbank etwas schief geht. Trotzdem sollte man vor Änderungen an der Registry grundsätzlich ein Registry-Backup machen (siehe Kasten auf Seite 222). Das hilft nicht nur zuverlässig bei eigenen Pannen, sondern repariert Windows auch dann in Sekundenschnelle, wenn wieder einmal Software- oder Hardware-Installationen Mucken machen.

Eigene Daten speichern

Voraussetzung für die Skripte ist der Windows Scripting Host [1, 2]. Dessen WScript.Shell-Objekt liefert bereits rudimentäre Registry-Funktionen frei Haus: RegRead, RegWrite und RegDelete. Diese Methoden wurden ursprünglich entworfen, um Skriptentwicklern die Möglichkeit zu geben, eigene Daten in der Registry zu speichern, und das funktioniert auch sehr gut.

Das Skript showtime.vbs zeigt, wie ein Skript protokollieren kann, wann es zum letzten Mal aufgerufen wurde. Es definiert sich dazu ein privates Plätzchen in der Registry, und zwar im Zweig HKCU\Software\. HKCU steht für HKEY_CURRENT_USER, also für die Einstellungen des gerade angemeldeten Benutzers. Soll das Skript für alle User einen gemeinsamen Zähler verwenden, dann ersetzt man HKCU durch HKLM: HKEY_LOCAL_MACHINE.

Nun braucht es nur mittels RegRead die Information, wann es zum letzten Mal gestartet wurde, aus dem Eintrag auszulesen. Anschließend aktualisiert es diesen mit RegWrite und schreibt die augenblicklichen Datumsinformationen in die Registry zurück. Damit dabei keine Fehler passieren, kapselt das Skript den RegRead-Befehl in einer eigenen Funktion: ReadKey. Fehler können beispielsweise auftreten, wenn man versucht, einen nicht vorhandenen Schlüssel zu lesen - das ist auch beim ersten Start des Skriptes der Fall. Übrigens gelten für Windows NT hier andere Regeln (siehe Kasten auf Seite 221).

Andere Quellen

Wesentlich interessanter wird das Ganze, wenn man Windows-eigene Daten per Skript verwaltet. Das System verhält sich dabei wie jedes Anwendungsprogramm auch, es speichert seine eigenen Einstellungen in einem der beiden oben beschriebenen Software-Keys, genauer gesagt im Zweig Software\Microsoft\Windows\CurrentVersion\. Im Microsoft-Pfad melden sich übrigens auch alle anderen Programme des Herstellers an. Als Anwender von Windows NT/2000 ersetzen Sie einfach `Windows´ durch `Windows NT´.

Diese Ortskunde lässt sich weidlich nutzen: Das Skript install.vbs macht es beispielsweise möglich, endlich das Installationslaufwerk zu korrigieren. Von diesem Laufwerk installiert Windows Treiber und Komponenten nach. Eine Änderung ist dringend nötig, wenn sich seit der Windows-Installation die Laufwerkszuordnungen geändert haben. Das Skript liest dazu den alten Installationspfad aus der Registry und bietet an, diesen zu ändern. Änderungen schreibt es dann wieder zurück.

Windows NT verlangt normalerweise bei jedem Start eine ordentliche Anmeldung mit User-Namen und Passwort. Wer den Rechner aber fernwarten möchte oder auch einfach nur keine Lust auf die tägliche Anmeldung hat, weil er ohnehin nur zu Hause am Rechner sitzt, kann das mit dem Skript lassmichrein.vbs ändern. Es nutzt spezielle Registry-Schlüssel, um den Rechner automatisch anzumelden. Ratsam ist das aber wirklich nur im heimischen Umfeld, denn anschließend kann jeder ohne Kennwort mit dem Rechner arbeiten, und das Anmeldekennwort liegt zudem unverschlüsselt in der Registry.

Das Skript prüft zuerst, ob `AutoAdminLogon´ in der Registry der Wert `1´ zugewiesen ist, ob also die automatische Anmeldung aktiviert ist. Falls ja, bietet es an, die Automatik abzuschalten, andernfalls kann man sie einschalten. Damit Windows Sie automatisch anmelden kann, benötigt das Skript noch Informationen über Ihren Benutzernamen, das Kennwort und gegebenenfalls die Domäne, an der es Sie anmelden soll. All diese Informationen werden in der Registry vermerkt. Der nächste Windows-Start erfolgt bereits ohne Anmeldeformular.

Werkzeugkasten selbst gemacht

Wer mehr vorhat, als nur einfache Werte aus der Registry auszulesen, der stößt freilich schnell an die Grenzen der mitgelieferten Registry-Befehle: Die können nämlich weder Binärdaten schreiben noch Registry-Schlüssel auflisten. Man kommt also nur an Schlüssel heran, deren Namen man vorher kennt; Binärdaten bleiben tabu.

Abhilfe schafft eine Befehlserweiterung, welche dem Scripting Host die fehlenden Registry-Befehle beibringt und mangels Platz auf heise online zu finden ist [3]. Die benötigten Runtime-Dateien von Visual Basic 5 sind in der Datei regtool.zip bereits enthalten.

Die Befehlserweiterung regtool.ocx kopiert man einfach in den Windows-Ordner und registriert sie anschließend im System: Rufen Sie dazu im Startmenü `Ausführen´ auf und geben Sie ein: REGSVR32.EXE regtool.ocx.

Das Tool greift auf die offiziellen API-Funktionen für den Registry-Zugriff zu, die Skripten normalerweise nicht offen stehen. Damit geht es zwar denselben Weg wie das WScript.Shell-Objekt, nur eben noch einige Schritte weiter. Skripte erhalten damit vollen Zugriff auf die Registry, ohne sich um die komplizierten Low-Level-Funktionen des API kümmern zu müssen, die normalerweise nötig sind.

Windows 95/98 optimieren

Das Skript caching.vbs demonstriert die neuen Registry-Funktionen im Alltag. Es liest die verfügbaren Caching-Profile für das Dateisystem aus der Registry aus. Diese Profile werden sichtbar, wenn man das Arbeitsplatzsymbol mit der rechten Maustaste anklickt und `Eigenschaften´ wählt. Klicken Sie auf das Register `Leistungsmerkmale´ und dann auf die Schaltfläche `Dateisystem´.

Dieser spezielle Cache, der in Windows `Leseoptimierung (Read-ahead)´ heißt, beschleunigt den Zugriff auf Dateien und Ordner, die man kürzlich geöffnet hat. Die Zugriffsinformationen für diese Dateien und Ordner werden einfach noch eine Zeitlang vorgehalten. Das Pop-up-Menü `Standardnutzung dieses Computers´ bietet drei verschiedene Nutzungsprofile an, ohne sich weiter darüber auszulassen, worin sich die Profile eigentlich unterscheiden.

Weil dieser Cache nur bei Windows 95/98 existiert, prüft das Skript zuerst, auf welcher Plattform es läuft - und bricht bei Windows-NT-Systemen automatisch ab. Hat es dagegen Windows 95 oder 98 erkannt, dann werden die in der Registry vorhandenen Caching-Profile gelesen, genauer gesagt die Unterschlüssel von `FS Templates´. Dieser Eintrag selbst enthält den Namen des augenblicklichen Caching-Profils.

Die eigentliche Cache-Einstellung, also die Zahl der Datei- und Ordnernamen, die Windows zwischenspeichert, sind in der Registry binär gespeichert. Die neue RegRead-Methode der Befehlserweiterung kann diese Daten problemlos lesen, und CalculateHex wandelt die hexadezimale Zahl in eine dezimale um.

Diese Einstellungen legt Ihnen nun AskNumber zur Bearbeitung vor. Anschließend verwandelt CalculateBinary die Werte zurück in die hexadezimale Schreibweise. Diese landet dann schließlich wieder in der Registry.

Die Cache-Tuning-Aktion ist nicht nur interessant, sie kann sogar bitter nötig sein: Zumindest in älteren Windows-95-Systemen (bis Version 4.00.950A) versteckt sich nämlich ein peinlicher Fehler - Microsoft hat in den Profilen die Angaben für Datei- und Ordnercache vertauscht. Um diesen Fehler auszubügeln, wählen Sie jeweils die Profile `Mobile´ und `Server´, und korrigieren Sie die Werte gemäß der folgenden Tabelle - oder setzen Sie gleich andere Werte ein.

ProfilDatei-CacheOrdner-Cache
Mobile33716
Server272964

Über Grenzen hinweg

Das Skript kann sogar ganz neue Profile anlegen und bietet so für Experimente ausreichenden Rahmen. Wollen Sie ein Profil wieder entfernen, dann hilft das Skript profilweg.vbs. Aus Sicherheitsgründen bietet es die Standardprofile gar nicht erst zum Löschen an.

Die Gestaltung plattformunabhängiger Skripte ist nicht ganz leicht. Oben wurde deutlich, dass Windows 9x und Windows NT/2000 unterschiedliche Schlüssel verwenden, und einige Registry-Operationen wie das Cache-Tuning funktionieren ohnehin nur bei Windows 9x.

Die Registry-Befehlserweiterung kann helfen: GetWinVer ermittelt die aktuelle Windows-Version und hilft so, die Caching-Skripte vor Windows NT/2000 abzuschotten. Darüber hinaus unterstützen alle Reg-Befehle einige zusätzliche Hauptschlüssel. WINUSER verweist immer automatisch in den Schlüssel HKEY_CURRENT_USER\Software\Microsoft\Windows (NT)\CurrentVersion und WINMACHINE erledigt dasselbe mit dem entsprechenden Schlüssel in HKEY_LOCAL_MACHINE. So werden plattformübergreifende Skripte möglich, und diese beiden Zeilen lesen unisono auf jeder Windows-Version den registrierten Benutzernamen aus:

set tool = CreateObject("regtool.tob")
MsgBox tool.RegRead ("WINMACHINE\RegisteredOwner")
Speichern Sie das Skript am besten unter dem Namen owner.vbs ab.

Bleibt allerdings die Frage: Wo verstecken sich die undokumentierten Registry-Einstellungen, die man per Skript-Dialog nutzen könnte? Einblick verschafft hier ein besonderes Spionage-Tool: RegMon [4] klinkt sich in den Datenverkehr zwischen Programmen und der Registry ein und macht so sichtbar, welche Einträge gelesen und geschrieben werden. Sollte die Hersteller-Site wieder einmal überlaufen sein, kann man auf [5] ausweichen. Unter dem Stichwort RegMon werden dort Versionen für Windows 95/98 und NT zum Download angeboten. RegMon ist Freeware und nur wenige Kilobyte groß.

Schatzkarte

Nach dem Start des Tools ist allerdings zunächst eine Hürde zu nehmen: Listet RegMon bereits eifrig Registry-Zugriffe auf, obwohl Sie gar nichts tun, dann sind Hintergrundprogramme aktiv und stören die Forschungsarbeit. Rufen Sie in diesem Fall per [Strg+Alt+Entf] die Taskliste auf und entfernen Sie alle störenden Programme. Hierzu zählen vor allem Virenscanner, Performance-Monitore und das Indexprogramm FindFast des MS-Office-Pakets. Ein Blick ins Gerätefeld respektive in die Tray der Taskleiste lohnt sich ebenfalls, auch hier sollte man alle Zusatztools deaktivieren.

minpic03.jpg

Äußerst hilfreich bei der Arbeit mit der Registry: RegMon protokolliert alle Zugriffe.

Hat sich die Anzeige von RegMon beruhigt, dann kann die Erkundungstour beginnen. Öffnen Sie Menüs oder Programme, und beobachten Sie, welche Registry-Einträge vorgenommen werden.

RegMon kann sogar vollautomatisch undokumentierte Registry-Einstellungen ausgraben. Dazu wählt man im Events-Menü den Eintrag `Filter´. Dadurch werden nur die Optionen `Log Errors´ und `Log Reads´ aktiviert. RegMon protokolliert ab sofort nur noch vergebliche Registry-Lesezugriffe, also solche, die auf nicht existierende Registry-Werte zugreifen wollen.

Symbolhaft

Wählt man anschließend im Startmenü `Einstellungen´, so listet RegMon zwei undokumentierte Einstellungen auf: `Max Cached Icons´ und `Shell Small Icon Size´. kleineicons.vbs zeigt, was passiert, wenn man mit letzterem Schlüssel experimentiert. Plötzlich wird es möglich, nicht nur die normalen großen Icons zu verändern, sondern auch die kleinen. Iconnormal.vbs ist das Gegengift.

Das Skript verwendet eine weitere neue Methode der Registry-Befehlserweiterung: RefreshWindowMetrics aktualisiert die Einstellungen des Registry-Schlüssels `WindowMetrics´, ohne dass man dafür Windows neu starten müsste.

Max Cached Icons ist noch nützlicher: Dieser Eintrag legt die Größe des Icon-Caches fest, in dem Windows aus Geschwindigkeitsgründen Symbole puffert. Erscheinen diese auf Ihrem System häufig verstümmelt, sollten Sie den Icon-Cache mit dieser Einstellung vergrößern.

Der Icon-Cache ist für die Darstellung jeglicher System- und Datei-Icons zuständig und verhindert, dass Windows bei jedem Desktop-Refresh und jedem neuen Explorerfenster die Symbole neu aus den Icon-Dateien extrahieren muss. Gerät der Cache durcheinander, weil beispielsweise die Indexnummern der darin enthaltenen Icons nicht mehr stimmen, dann erscheinen plötzlich vertauschte Icons, und ein WinWord-Dokument zeigt beispielsweise das Symbol eines ganz anderen Programms. Um den Icon-Cache neu erstellen zu lassen, genügt es, die Icon-Größe kurzfristig zu ändern. Dadurch zwingt man Windows dazu, neue Icons vorzubereiten. Dies kann entweder manuell über das Registerblatt `Darstellung´ der Anzeige-Eigenschaften geschehen oder eben automatisiert - FlushIconCache demonstriert, wie so was funktioniert.

Beide Einträge sind nur die Spitze des Eisbergs. RegMon listet bei weiterer Suche Hunderte von undokumentierten Registry-Einstellungen auf.

Veränderungen sichtbar machen

Auch ein Schnappschuss-Vergleich der Registry ist aufschlussreich. Dazu startet man den Registrierungseditor über `Ausführen´ im Startmenü. Anschließend kann man aus dem Registrierung-Menü über `Registrierung exportieren´ die gesamte Registry als REG-Datei speichern. Wählen Sie als Dateinamen `VORHER.REG´, als Zweig `Alles´. Nun nimmt man die gewünschten Änderungen an den Windows-Einstellungen vor und legt erneut eine Kopie der Registry an: `NACHHER.REG´ - wiederum mit dem Zweig `Alles´.

minpic04.jpg

WinDiff vergleicht zwei Dateien und verrät hier, wo in der Registry das Desktop-Hintergrundbild festgelegt wird.

Diese beiden Dateien dokumentieren die Einstellungen, die Sie zwischen den Schnappschüssen in der Registry verursacht haben. Um die Änderungen auszuwerten, kann man beispielsweise eine Textverarbeitung wie Word verwenden und sich deren Versionsvergleich zu Nutze machen: Menü `Extras´ - `Änderungen verfolgen´ - `Dokumente vergleichen´. Das Programm hebt dann die Änderungen hervor, was aufgrund der umfangreichen Exportdateien allerdings mehrere Minuten dauert. Alternativ kann man auch zum kostenlosen Microsoft-Tool `WinDiff´ greifen, das auf den meisten Windows-98-CDs mitgeliefert wird. WinDiff vergleicht ebenfalls zwei Textdateien, der zuständige Eintrag heißt `Compare Files´ und findet sich im File-Menü. Klicken Sie nach der Auswahl der Dateien auf die Zeile im Fenster und anschließend rechts oben auf die Schaltfläche `Expand´. Nach einigen Sekunden ist der Vergleich abgeschlossen, und durch Drücken der F8-Taste kann man dann die Änderungen auflisten.

minpic06.jpg

Die Shareware TechFacts ermittelt Registry-Änderungen vollautomatisch.

Noch komfortabler funktioniert das System-Informationstool TechFacts, eine Shareware, die für alle Windows-Versionen angeboten wird [6]. Sie stellt nicht nur allerhand Systeminformationen dar, sondern verwaltet auch automatisch die Registry-Schnappschüsse und hebt Änderungen blitzschnell hervor. Dazu klickt man auf das Register `Tools´ und wählt `Watch Registry´. Ein Klick auf `Go´ legt den Schnappschuss an. Ein Klick auf `End Watch´ legt einen zweiten Schnappschuss an und vergleicht die Änderungen.

Darüber hinaus kann TechFacts übrigens auch Festplatten und Ordner überwachen und so lückenlos dokumentieren, wie beispielsweise ein Programm während seiner Installation das System verändert.

Änderungen durchsetzen

Nicht alle Änderungen an der Registry zeigen sofortige Wirkung. Zuerst muss man Windows provozieren, die veränderten Werte aus der Registry zu lesen und damit zur Kenntnis zu nehmen. Der einfachste, aber auch langwierigste Weg ist ein kompletter Windows-Neustart. Zum Glück gibt es elegantere.

Das Skript kleineicons.vbs hat bereits gezeigt, wie man mit RefreshWindowMetrics die Explorer-Einstellungen aus dem Schlüssel HKCU\Control Panel\Desktop\WindowMetrics aktiviert. Dabei sendet das Tool eine Aufforderung an alle Fenster, sofort in diesem Schlüssel nachzuschauen und Änderungen zur Kenntnis zu nehmen.

Änderungen an Icons wirken sich erst aus, wenn der Icon-Cache geleert und neu geschrieben wird. Das ist wie gesagt auch ratsam, wenn Icons unansehnlich werden. Haben Sie Schwierigkeiten mit Icons, oder verändern sich Icons plötzlich, dann hilft dieses Miniskript:

set tool = CreateObject("regtool.tob") 	
tool.FlushIconCache 
Es lässt den Icon-Cache neu erstellen. Damit alle Programme den neuen Icon-Cache verwenden, sollte man sie neu starten.

minpic07.jpg

Bei sonderbaren Icon-Metamorphosen muss man den Icon-Cache neu erstellen lassen: per Skript kein Problem.

FlushIconCache kann aber noch weitaus mehr. Es gestattet zum Beispiel, skriptgesteuert alle System-Icons durch beliebige andere Icons zu ersetzen. Dazu tragen Sie ins Skript neueicons.vbs die Kennzahl des System-Icons ein und geben dann das Icon an, das an seine Stelle treten soll. Diese Kennzahl ist leicht zu ermitteln: Klicken Sie eine beliebige Verknüpfung mit der rechten Maustaste an und wählen `Eigenschaften´. Ein Klick auf `Anderes Symbol´ öffnet das Icon-Auswahlfenster. Hier löscht man die oberste Zeile und drückt die Enter-Taste. Jetzt zeigt das Fenster die System-Icons an. Die Kennzahl entspricht der Position. Neue Ordnersymbole bekommt man also über die Kennzahl 3. Sämtliche Startmenü-Icons sind ebenfalls Teil der System-Icons und lassen sich auf gleiche Weise austauschen. Sogar der Verknüpfungspfeil (Kennzahl 29) lässt sich so verschönern.

Falls Sie sich vertan haben: Alle Icon-Änderungen werden mit dem Skript Iconstandard.vbs auf einen Schlag wieder rückgängig gemacht.

Software vorkonfektionieren

Nicht nur Windows speichert seine Einstellungen in der Registry; auch fast alle übrigen Programme tun das. Das kann man sich zu Nutze machen, um Programmeinstellungen vorzubestimmen. Bei Spielen lassen sich so beispielsweise die Art des Joysticks oder die Netzwerkeinstellungen für verschiedene Szenarien im Voraus definieren.

Dazu verwendet man am besten das oben beschriebene Tool TechFacts und lässt sich per Schnappschussvergleich die entscheidenden Stellen der Registry zeigen: Schnappschuss anlegen, gewünschte Einstellungen manuell vornehmen und Vergleich starten.

Anschließend kann ein Skript die gewünschten Voreinstellungen je nach Bedarf in die Registry eintragen und über die Run-Methode des WScript.Shell-Objektes das Spiel auch gleich starten. Weil diese Registry-Einstellungen beim Programmstart auf jeden Fall frisch eingelesen werden, ist der Erfolg garantiert.

Ein ganz anderer Ansatz ist für geplagte Verwalter von Schulungsräumen interessant, die es leid sind, nach jeder Veranstaltung unzählige Programmeinstellungen auf die Vorgaben zurückzusetzen. Dazu sucht man sich in `HKEY_CURRENT_USER\Software´ der Registry den Zweig aus, der für das betreffende Programm zuständig ist, beispielsweise `Microsoft\Office\´. Diesen Schlüssel exportiert man im Registrierungseditor über `Registrierung´ - `Registrierung exportieren´. Die dadurch entstandene REG-Datei kann ein Skript, das man in der Autostartgruppe platziert, bei jedem Neustart einlesen. Das erledigt wiederum die Run-Methode des WScript.Shell-Objektes:

set wshshell = CreateObject("WScript.Shell")
wshshell.Run "REGEDIT.EXE /S                
                   C:\VORGABEN.REG"
So werden alle Einstellungen automatisch auf die Standardeinstellungen zurückgesetzt, die galten, als der Registry-Auszug erstellt wurde. Die Option `/S´ sorgt dafür, dass die REG-Datei ohne lästige Rückfrage eingelesen wird.

Mit etwas Know-how und den richtigen Skripten kann man sich also die Windows-Registry ohne Gefahr untertan machen. Und wenn Sie sich doch mal vertan haben, stellen Sie einfach die letzte Fassung der Registrierdatenbank wieder her. (se)

Literatur
[1] Tobias Weltner: Zaubern mit Windows, Mehr Komfort beim Automatisieren: Scripting Host 2.0 und VBScript 5.0, c't 21/99, S. 294

[2] Tobias Weltner: Professional Series Scripting Host Praxisbuch, Franzis´-Verlag

[3] regtool.ocx und regtool.zip auf heise online: www.heise.de/ct/ftp/listings.shtml

[4] RegMon, www.sysinternals.com

[5] RegMon, alternativ auf www.softseek.com

[6] TechFacts, www.winutils.com/diagnost.htm

Kasten 1


Listing 1

Das Windows-Installationsverzeichnis kann man auch ohne Biegen und Brechen nachträglich verändern - mit install.vbs.

set wshshell = CreateObject("WScript.Shell")

key = "HKLM\Software\Microsoft\Windows\CurrentVersion\Setup\"
' Diesen Schlüssel für Windows NT verwenden:
'key = "HKLM\Software\Microsoft\Windows NT\CurrentVersion\"

install = ReadKey(key & "SourcePath")
newinstall = InputBox("Neues Installationsverzeichnis",,install)
if newinstall = vbEmpty then WScript.Quit
wshshell.RegWrite key & "SourcePath", newinstall

function ReadKey(key)
     ' Fehlerhandling abschalten
     on error resume next
     ' Schlüssel lesen
     ReadKey = wshshell.RegRead(key)
     ' klappte es? Existiert Schlüssel?
     if not err.number=0 then
          ' nein!
          err.clear
          ReadKey = vbEmpty
     end if
end function
Kasten 2

Listing 2

Auch Skriptprogramme können ihre Daten in der Windows-Registry speichern - das Skript showtime.vbs zeigt, wie´s geht.

' showtime.vbs
' vermerken, wann skript zum letzten mal aufgerufen wurde

set wshshell = CreateObject("WScript.Shell")

' mein privater Registry-Schlüssel
key = "HKCU\Software\MeinPrivatSchluessel\"

' auslesen, wann zuletzt aufgerufen wurde
besuch = ReadKey(key & "letzterbesuch")
if besuch = vbEmpty then
     MsgBox "Ich wurde zum ersten Mal aufgerufen!"
else
     msg = "Sie haben mich zuletzt benutzt am: " & besuch & vbCr
     tage = DateDiff("d", besuch, now)
     anzahl = ReadKey(key & "zaehler")
     msg = msg & "Das ist jetzt " & tage & " Tage her." & vbCr
     msg = msg & "Insgesamt waren es " & anzahl & " Besuche." & vbCr
     msg = msg & "Zähler löschen?"
     antwort = MsgBox(msg, vbYesNo + vbQuestion + vbDefaultButton2)
end if

' Zähler aktualisieren
wshshell.RegWrite key & "letzterbesuch", now
wshshell.RegWrite key & "zaehler", anzahl + 1

' falls gewünscht, Schlüssel entfernen
if antwort = vbYes then
     ' Registry Schlüssel entfernen
     wshshell.RegDelete key
end if


function ReadKey(key)
     ' Fehlerhandling abschalten
     on error resume next
     ' Schlüssel lesen
     ReadKey = wshshell.RegRead(key)
     ' klappte es? Existiert Schlüssel?
     if not err.number=0 then
          ' nein!
          err.clear
          ReadKey = vbEmpty
     end if
end function
Kasten 3

Listing 3

lassmichrein.vbs umgeht das Anmeldefenster von Windows NT und 2000.

set wshshell = CreateObject("WScript.Shell")
key = "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\"
state = ReadKey(key & "AutoAdminLogon")
if state=1 then
     msg = "AutoLogon ist aktiviert. Möchten Sie es abschalten?"
else
     msg = "AutoLogon ist nicht aktiviert. Möchten Sie es einschalten?"
end if

antwort = MsgBox(msg, vbYesNo + vbQuestion)

if antwort = vbYes then
     if state=1 then
          DeleteKey key & "AutoAdminLogon"
          DeleteKey key & "DefaultUserName"
          DeleteKey key & "DefaultPassword"
          DeleteKey key & "DefaultDomainName"
          MsgBox "Einstellungen gelöscht"
     else
          name = Ask("Unter welchem Namen soll angemeldet werden?")
          password = Ask("Wie lautet das Kennwort?")
          antwort = MsgBox("Wollen Sie sich an einer Domäne anmelden?", 
                      vbYesNo + vbQuestion)
          if antwort = vbYes then
               domain = Ask("An welcher Domäne soll angemeldet werden?")
               wshshell.RegWrite key & "DefaultDomainName", domain
          end if
          wshshell.RegWrite key & "DefaultUserName", name
          wshshell.RegWrite key & "DefaultPassword", password
          wshshell.RegWrite key & "AutoAdminLogon", 1
          MsgBox "Einstellungen eingetragen."
     end if
end if


function ReadKey(key)
     ' Fehlerhandling abschalten
     on error resume next
     ' Schlüssel lesen
     ReadKey = wshshell.RegRead(key)
     ' klappte es? Existiert Schlüssel?
     if not err.number=0 then
          ' nein!
          err.clear
          ReadKey = vbEmpty
     end if
end function

function DeleteKey(key)
     on error resume next
     dummy = wshshell.RegRead(key)
     if err.number=0 then
          wshshell.RegDelete key
          if not err.number=0 then
               MsgBox "Schlüssel """ & key & """ konnte nicht gelöscht 
                       werden: " & err.description
               err.clear
          end if
     end if
end function

function Ask(frage)
     Ask = InputBox(frage)
     if Ask="" then WScript.Quit
end function

minpic02.jpg

Sie wollen sich bei Windows NT/2000 automatisch anmelden? Mit dem richtigen Skript kein Problem.

Kasten 4


Listing 4

caching.vbs ändert die Caching-Einstellungen von Windows.

set tool = CreateObject("regtool.tob")
if tool.GetWinVer="Windows NT" then
     MsgBox "Dieses Skript funktioniert nur auf Windows 95/98!"
     WScript.Quit
end if

key = "HKLM\Software\Microsoft\Windows\CurrentVersion\FS Templates\"

' herausfinden, welche Optimierungsmodi es gibt
set unterschluessel = tool.RegEnum(key)
for each schluessel in unterschluessel
     list = list & schluessel & vbTab & " (" & tool.RegRead(key & schlues-
sel & "\") & ")" & vbCr
next

' herausfinden, welcher Modus aktiv ist
aktiv = tool.RegRead(key)

msg = "Diese Optimierungsprofile sind derzeit eingerichtet:" & vbCr
msg = msg & list
msg = msg & vbCr & "Das aktive Profil lautet: " & aktiv & vbCr & vbCr
msg = msg & "Wenn Sie ein Profil ändern wollen, dann geben Sie den Namen 
            an (nicht den Namen in Klammern!)." & vbCr
msg = msg & "Sie können auch einen neuen Namen angeben und so ein neues 
            Profil anlegen." & vbCr
msg = msg & "Klicken Sie auf Abbrechen, wenn Sie keine Änderungen 
            vornehmen wollen."

profil = InputBox(msg)
if profil = vbEmpty then WScript.Quit
if not tool.KeyExists(key & profil & "\") then
     antwort = MsgBox("Das Profil """ & profil & """ existiert noch nicht. 
           Neu anlegen?", vbYesNo + vbQuestion)
     if antwort = vbNo then WScript.Quit
     beschreibung = InputBox("Wie soll Ihr Profil heißen?",,
           "Mein neues Powerprofil")
     if beschreibung = vbEmpty then WScript.Quit
end if

' Binäre Daten lesen
on error resume next
namecache = tool.RegRead(key & profil & "\NameCache")
pathcache = tool.RegRead(key & profil & "\PathCache")
namecachecount = CalculateHex(namecache)
pathcachecount = CalculateHex(pathcache)
on error goto 0

' Werte ändern
msg = AskNumber("Legen Sie fest, wieviel Dateinamen gecacht werden 
         sollen", namecachecount)
tool.RegWrite key & profil & "\NameCache", CalculateBinary(msg), 
         "REG_BINARY"
msg = AskNumber("Legen Sie fest, wieviel Ordnernamen gecacht werden 
         sollen", pathcachecount)
tool.RegWrite key & profil & "\PathCache", CalculateBinary(msg), 
         "REG_BINARY"
if not beschreibung="" then tool.RegWrite key & profil & "\", beschreibung
' Aktivieren?
antwort = MsgBox("Soll Ihr neues Profil aktiviert werden?", vbYesNo + 
           vbQuestion)
if antwort = vbYes then
     tool.RegWrite key, profil
     MsgBox "Starten Sie Windows neu, damit die Wirkungen aktiv werden."
end if

function CalculateHex(hexzahl)
     if len(hexzahl)<11 then
          CalculateHex=0
     else
          temp = Replace(hexzahl, " ", "")
          hex1 = "&H" & left(temp, 2)
          hex2 = "&H" & mid(temp, 3, 2)
          CalculateHex = 256 * CInt(hex2) + CInt(hex1)
     end if
end function

function calculateBinary(zahl)
     temp = right("0000" & hex(zahl),4)
     calculateBinary = right(temp,2) & " " & left(temp,2) & " 00 00"
end function

function AskNumber(frage, vorgabe)
     AskNumber = InputBox(frage,,vorgabe)
     if AskNumber=vbEmpty then WScript.Quit
     if not isNumeric(AskNumber) then
          MsgBox "Sie haben keine Zahl eingegeben.", vbCritical
          WScript.Quit
     end if
end function
Kasten 5

Listing 5

profilweg.vbs löscht selbst gemachte Profile wieder.

set tool = CreateObject("regtool.tob")
if tool.GetWinVer="Windows NT" then
     MsgBox "Dieses Skript funktioniert nur auf Windows 95/98!"
     WScript.Quit
end if

key = "HKLM\Software\Microsoft\Windows\CurrentVersion\FS Templates\"

' herausfinden, welche Optimierungsmodi es gibt
set unterschluessel = tool.RegEnum(key)
for each schluessel in unterschluessel
     test = ucase(schluessel)
     if not (test = "DESKTOP" or test = "MOBILE" or test = "SERVER") then
          list = list & schluessel & vbTab & " (" & tool.RegRead(key & 
               schluessel & "\") & ")" & vbCr
          count = count + 1
     end if
next

if count > 0 then
     msg = "Diese Profile sind zusätzlich eingerichtet:" & vbCr & vbCr
     msg = msg & list & vbCr & vbCr & "Geben Sie den Profilnamen ein, den 
           Sie löschen wollen!"
     antwort = InputBox(msg)
     if antwort = vbEmpty then
          MsgBox "Abbruch."
     else
          if tool.KeyExists(key & antwort & "\") then
               tool.RegDelete key & antwort & "\"
               MsgBox "Profil gelöscht."

               ' Standard herausfinden
               if ucase(tool.RegRead(key)) = ucase(antwort) then
                    ' ups, Standard war das gelöschte Profil.
                    ' stattdessen "Desktop" als neues Profil eintragen
                    tool.RegWrite key, "Desktop"
                    MsgBox "Neues Standardprofil: Desktop. Starten Sie 
                            Windows neu, " _
                         & "um es zu aktivieren!"
               end if
          else
               MsgBox "Unbekanntes Profil. Nichts gelöscht."
          end if
     end if
else
     MsgBox "Keine zusätzlichen Profile eingerichtet."
end if
Kasten 6

Listing 6

Kleine Icons verändern mit kleineicons.vbs.

set tool = CreateObject("regtool.tob")
key = "HKCU\Control Panel\Desktop\WindowMetrics\Shell Small Icon Size"
wert = InputBox("Wie groß sollen kleine Icons werden?",,20)
if not isNumeric(wert) then fehler
icongroesse = CInt(wert)
if icongroesse<5 or icongroesse>32 then fehler

' neue Werte einstellen
tool.RegWrite key, icongroesse
tool.RefreshWindowMetrics

sub fehler
     MsgBox "Ungültige Größe. Geben Sie eine Größe zwischen 5 und 32 ein!"
     WScript.Quit
end sub
Kasten 7

Listing 7

iconnormal.vbs ist das Gegengift.

set tool = CreateObject("regtool.tob")
key = "HKCU\Control Panel\Desktop\WindowMetrics\Shell Small Icon Size"
tool.RegDelete key
tool.RefreshWindowMetrics
Kasten 8

Listing 8

Iconstandard.vbs macht alle Icon-Änderungen auf einen Schlag rückgängig.

set tool = CreateObject("regtool.tob")
key = "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons\"
tool.RegDelete key
tool.FlushIconCache
Kasten 9

Listing 9

Mit neueicons.vbs ersetzt man ein Icon einer Datei.

set tool = CreateObject("regtool.tob")
key = "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons\"

' neue Ordnersymbole
changeIcon 3, "shell32.dll,20"

' neuer Verknüpfungspfeil
changeIcon 29, "cdfview.dll,0"

' sichtbar machen
tool.FlushIconCache

sub changeIcon(kennzahl, neuesicon)
     tool.RegWrite key & kennzahl, neuesicon
end sub
Kasten 10

NT-Registry: Mit List und Tücke

Wer sich unter Windows NT nicht intensiv mit der Registrierung beschäftigt hat, dem dürften einige Besonderheiten entgangen sein. Dort existieren zum Bearbeiten der Datenbank gleich zwei Programme: regedit.exe, wie es von Windows 9x bekannt ist, sowie regedt32.exe, speziell für NT. Es gibt zwei wesentliche Unterschiede. regedt32, das auch zu Windows 2000 gehören wird, kann nicht nur die Daten selbst, sondern zusätzlich die in der Datenbank hinterlegten Sicherheitsinformationen anzeigen und bearbeiten. Ferner ist es mit regedt32 möglich, Teile einer fremden Registrierung zu manipulieren.

minpic05.jpg

Unbekannte Größe: Der alternative Editor regedt32.exe für die NT-Registrierungsdatenbank erlaubt sogar Eingriffe an einer brachliegenden NT-Installation.

Grundsätzlich ist die Registrierung einer NT-Installation mit Angaben zur Sicherheit durchsetzt. Ähnlich wie für Dateien auf einer NTFS-Partition gibt das System vor, welcher Benutzer welche Daten in der Registrierung einsehen und ändern darf. Tatsächlich unterscheidet NT verschiedene Zugriffsformen, etwa Lesen, Setzen und Anlegen, sogar noch feiner. Analog zu anderen Objekten (etwa Dateien) sieht NT für jeden Schlüssel auch einen Eigentümer vor. Zusätzlich erlaubt es NT, Zugriffe auf einzelne Einträge in der Registrierung zu überwachen - ähnlich wie das auch für Dateien möglich ist.

Der Nutzwert dieser Information scheint zunächst gering. Doch er kann sich in einigen Fällen bezahlt machen: Zum einen lassen sich Schlüssel in der Registrierung auf diese Weise schützen, zum anderen kann man so herausfinden, welcher Benutzer sich laufend an bestimmten Einträgen zu schaffen macht. Ganz Neugierigen steht damit auch der Blick in die von einer NT-Installation geführte Benutzerdatenbank offen: Sie räumen sich dazu auf dem Schlüssel SAM als Administrator Leserechte ein (Vorsicht: unter Umständen öffnet das Eindringlingen Tür und Tor).

Wer parallel zum Einsatz des Benutzermanagers dann noch RegMon (siehe Kasten auf Seite 223) laufen lässt, bekommt viel über die Benutzerdatenbank und die Art und Weise heraus, wie Windows NT beziehungsweise 2000 mit diesen Daten umgehen. Aber man muss es gar nicht auf die Eingeweide von NT abgesehen haben, um Bekanntschaft mit den Sicherheitsinformationen in der Registrierung zu machen: Läuft eine vom Administrator installierte Applikation mit normalen Benutzerrechten nicht, kann die Ursache dafür ebenda liegen ...

Über die Sicherheit hinaus ist regedt32 das Mittel der Wahl, wenn es darum geht, besonders hartnäckige Konfigurationsprobleme, insbesondere Startprobleme, von NT auszuräumen: Über die Funktion `Load hive´, die das Programm anbietet, ist es nämlich möglich, Teile der Registrierung einer NT-Installation in einer anderen Installation einzulesen. Dazu muss man nur wissen, dass NT die Registrierung wie Windows 9x auch beim Systemstart aus herkömmlichen Dateien ausliest.

Bei Windows NT und 2000 liegen diese fünf Dateien im system32\config-Verzeichnis. system enthält die Systemkonfiguration, sam und security die vorhandenen Benutzer und sonstige Sicherheitsinformationen, software Angaben über die installierte Software und default die Daten des Standardbenutzers. Benutzerspezifische Registrierungsdaten entnimmt NT der user.dat-Datei im Profilverzeichnis (etwa winnt\profiles\ps).

Startprobleme resultieren zumeist durch unvorsichtige Eingriffe an der Systemkonfiguration. Die Datei, auf die es also ankommt, ist system. Wer eine zweite Installation von NT zur Hand hat, kann diese Datei über regedt32 mit der Funktion `Load hive´ direkt in die Registrierung importieren. Änderungen in der Datei (respektive Fremd-Registrierung) schreibt der Editor sofort zurück. Eine Undo-Funktion gibt es nicht. Alternativ kann man die Datei auf ein anderes System kopieren und später zurückholen.

Mit diesem Trick lässt sich in einer importierten Registrierung zum Beispiel ein versehentlich aktivierter Dienst abschalten. Es lassen sich aber auch andere Manipulationen vornehmen, für die eventuell ein Recht fehlen würde, etwa das Zurücksetzen der automatischen Anmeldung beim Systemstart. Die Zugriffe von einer Fremdinstallation aus sind möglich, da NT für Administratoren eine einheitliche Security ID (SID) vergibt. Ob auf die geschilderte Weise auch das Rücksetzen von vergessenen Passwörtern oder Ähnliches möglich ist, habe ich nie probiert. (ps)

Kasten 11


Registry sichern

Windows 95 kennt zwar noch keine eingebauten oder automatischen Mechanismen, es gibt aber doch Möglichkeiten, die Registry zu sichern. Freilich kann man die betreffenden Dateien von Hand, etwa per Copy-Befehl, an anderer Stelle speichern. Microsoft liefert im Windows-95-Paket aber auch ein etwas komfortableres Tool mit, dessen Bedienung den meisten Anwendern leichter fallen dürfte. Es findet sich auf der Windows-CD im Ordner OTHER\MISC\ERU. Kopieren Sie den gesamten ERU-Ordner per Maus oder Kommandozeile (XCOPY OTHER\MISC\ERU C:\ERU /S) auf die Festplatte. Das gleichnamige Programm ERU sichert alle wichtigen Windows-Einstellungen, darunter auch die Registry, an einen beliebigen Ort. Das von Windows selbst vorgeschlagene Ziel, eine Diskette (`Laufwerk A´), eignet sich allerdings aufgrund ihrer zu geringen Kapazität nicht. Legen Sie die Sicherung lieber auf der Festplatte an.

Um die Sicherung im Notfall wiederzubeleben, startet man den Rechner im DOS-Modus. Dazu drückt man die F8-Taste, sobald der Hinweis `Windows 95 wird gestartet...´ zu sehen ist, und wählt im Boot-Menü `Nur Eingabeaufforderung´. Anschließend wechselt man in den Ordner, in dem man die Sicherungsdaten gespeichert hat (CD ERU). In diesem Ordner ruft man ERD auf. Es stellt die Systemdateien wieder her. Bei einigen Versionen muss man dazu als Bestätigung nicht wie gefordert `J´, sondern `Y´ eingeben.

Windows 98 sichert - anders als 95 - automatisch jeden Tag die Registry und bewahrt die letzten fünf Sicherungen auf. Um Windows auf dem Stand des Vortages wiederzubeleben, startet man das System im DOS-Modus: Nach dem Einschalten die Strg-Taste festhalten und im Bootmenü `Nur Eingabeaufforderung´ wählen. Anschließend gibt man ein: SCANREG /RESTORE [Enter]. Das Programm prüft die Registry und stellt dann die unterschiedlichen Sicherungskopien zur Auswahl.

Leider hat SCANREG in den ersten Windows-98-Versionen einen Fehler. Wird außer der Reihe selbst eine Sicherungskopie angelegt, oder legt SCANREG /RESTORE bei der Wiederherstellung eine aktuelle Sicherungskopie an, dann stürzt das Tool ab. Abhilfe schafft ein Besuch im Ordner SYSBCKUP, der sich im Windows-Ordner befindet. Hier sollte man alle CAB-Dateien löschen, die ungewöhnlich groß sind (Indiz für Sicherungen, die von DOS aus angelegt wurden und defekt sind). Außerdem muss man alle CAB-Dateien entfernen, die manuell angelegt worden sind.

Kasten 12


Windows-Registrierung beobachten

Die Registrierung muss für Windows-Benutzer kein Buch mit sieben Siegeln bleiben: Mark Russinovich und Bryce Cogswell stellen auf ihrer Website [4] neben diversen interessanten Werkzeugen auch ein Monitorprogramm für Zugriffe auf die Registrierung bereit. Das Programm RegMon arbeitet sowohl unter Windows 9x als auch unter NT.

RegMon zeigt jeden (offiziellen) Zugriff auf die Registrierung an, kann aber auch nur einen ausgewählten Teil der Registrierung oder bestimmte Arten des Zugriffs überwachen. Es ist sogar möglich, alle Zugriffe auf die Registrierung während des Systemstarts zu beobachten. RegMon legt diese in einer Datei ab (eine solche Datei schwillt allerdings beim Start von Windows 2000 beispielsweise auf rund 15 MByte an).

Wer im Datennebel, den RegMon ausspuckt, nicht die Orientierung verlieren will, braucht schon eine Vorstellung davon, wo sich bestimmte Operationen in der Registrierung niederschlagen. Es hilft, RegMon erst unmittelbar dann scharf zu schalten, wenn eine Konfigurationsänderung etwa über die Bedienoberfläche vorgenommen wird. So hat man eine reelle Chance, den zugehörigen Eintrag in den RegMon-Ausgaben auch aufzufinden. (ps)


Zu diesem Artikel existieren Programmbeispiele
0300_216.zip

0300_216.txt