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.
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).
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.
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.
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.
Profil | Datei-Cache | Ordner-Cache |
Mobile | 337 | 16 |
Server | 2729 | 64 |
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ß.
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.
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.
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.
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.
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.FlushIconCacheEs lässt den Icon-Cache neu erstellen. Damit alle Programme den neuen Icon-Cache verwenden, sollte man sie neu starten.
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.
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)
[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
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 functionKasten 2
' 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 functionKasten 3
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
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 functionKasten 5
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 ifKasten 6
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 subKasten 7
set tool = CreateObject("regtool.tob") key = "HKCU\Control Panel\Desktop\WindowMetrics\Shell Small Icon Size" tool.RegDelete key tool.RefreshWindowMetricsKasten 8
set tool = CreateObject("regtool.tob") key = "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons\" tool.RegDelete key tool.FlushIconCacheKasten 9
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 subKasten 10
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)
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.
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)