Registry-Zugriff mit Cygwin

Mit Konsolen-Befehlen zu den Konfigurations-Daten

Cygwin ist die kostenlose Portierung der Shell-(bash)-Konsole und einiger leistungsfähiger Linux-Dienstprogramme auf Windows. Die Installation ist sehr empfehlenswert. Auf dieser Seite finden sie einige Beispiele, wie Cygwin-Funktionen für den Zugriff auf die Registry-Datenbank verwendet werden.
Achtung - Die Änderung von Registry-Daten kann irreversiblen Schaden an Betriebssystem, Programmen und Daten hervorrufen ! Sie folgen daher den hier vorgestellten Beispielen auf eigenes Risiko !
Cygwin Linux Shell-Konsole auf Windows: Installation, Konfiguration
Voraussetzung Saubere Cygwin-Installation und Konfiguration
Liste Ausgabe einer Liste von Subkeys oder Variablen-Namen
Wert Ausgabe des Wertes einer Variablen
Schleife Ausgabe aller Subkeys oder Variablen eines Keys
IP-Adresse Beispiel: Ausgabe der IP-Adresse eines PC (Router, Proxy)
Schreiben Schreiben / Ändern / Löschen einer Registry-Variablen
Umgebung Lesen und Schreiben von Umgebungs-Variablen
Registry Entwicklung mit Javacsript+ActiveX, Perl, PHP, VBA, ..

Voraussetzungen & Vorbereitungen

Für alle auf dieser Seite beschriebenen Beispiele muss Cygwin auf Windows vollständig installiert und sauber konfiguriert sein.
Details zur Installation von Cygwin auf Windows
Falls sie Linux verwenden, dann ergibt Cygwin keinen Sinn, da alle damit portierten Funktionen in ihrem System bereits enthalten sind. Die hier demonstrierte Funktion regtool gibt es in der Original Linux-Shell nicht, da Linux mit einfachen Text-Dateien konfiguriert wird.
Cygwin-Pfad
Cygwin sollte in diesem Pfad installiert sein:
C:\Programme\Cygwin
Wenn sie einen anderen Pfad verwenden, dann müssen sie alle Pfad-Angaben dieser Seite sinngemäß ändern.

Eigene Programme
Sie sollten ein Verzeichnis für eigene Programme angelegt haben, z.B.
C:\Programme\_myprox
Umgebungs-Variable
In Windows sollte eine Umgebungs-Variable mit dem Namen cyg und dem Pfad zu den Dienstprogrammen als Wert installiert sein:
C:\Programme\Cygwin\bin\
Test (Pfad, Programm regtool.exe - zeigt Info an) mit
C:\> path
C:\> echo %cyg%
C:\> regtool
Die Umgebungs-Variable PATH sollte folgende Pfade enthalten:
Den Pfad %cyg% zu den Cygwin Programmen
Den Pfad zu ihren eigenen Programmen

Details zur Konfiguration von Cygwin und zu Windows Umgebungs-Variablen.
Dienstprogramme
Wenn sie mit Cygwin nur die Grundfunktionen installiert haben, dann sollten sie die Installation aller verfügbaren Linux Shell Dienstprogramme nachholen.

Die Linux Shell Dienstprogramme sollten in diesem Pfad enthalten sein:
C:\Programme\Cygwin\bin
Für die Beispiele dieser Seite werden mindestens folgende Programme benötigt:
bash.exe, expr.exe, info.exe, man.exe, regtool.exe, sh.exe
Manual, Doku & Hilfe
Die Shell-Funktionen man und info bieten ausführliche Hilfe zu (fast) allen Funktionen.
Die Navigation erfolgt mit den Pfeiltasten der Tastatur, mit Taste q verlässt man das Manual wieder.
Hilfe zur Hilfe
$ man man
Hilfe zum Dienstprogramm regtool.exe
$ man regtool
$ info regtool
Bei sauberer Installation funktionieren Hilfe und das Dienstprogramm regtool auch auf der Windows-Konsole:
C:\> man regtool
Windows-Registry
In der Registry-Datenbank werden die Konfigurations-Daten des Windows Betriebssystems und der meisten Programme verwaltet. Die Datei ist versteckt, binär codiert und nur mit speziellen Programmen (z.B. regedit.exe ) oder mit dem Konsolen-Programm reg.exe zugänglich.
Die Datenbank ist in der Form eines hierarchischen Baums aufgebaut, ähnlich wie ein Datei-System. Jeder Schlüssel (key) entspricht ungefähr einem Dateisystem-Verzeichnis: Er kann Subkeys (Unter-Verzeichnisse) oder Variable (Dateien) enthalten.
Wenn sie wenig Erfahrung mit der Registry haben, sollten sie sehr vorsichtig vorgehen, die Registry mit regedit.exe genau untersuchen und keinesfalls (!) ohne sorgfältige Vorbereitung Registry-Daten ändern.
Das Wurzel-(root)-Segment teilt sich in 5 Schlüssel, deren Namen meist abgekürzt werden:
HKEY_CLASSES_ROOTHKCR
HKEY_CURRENT_USERHKCU
HKEY_LOCAL_MACHINEHKLM
HKEY_USERSHKU
HKEY_CURRENT_CONFIGHKCC
Jeder Schlssel sind durch seinen Pfad definiert. In Windows wird das \ Trennzeichen verwendet, in Cygwin-(Shell) das / Zeichen.
Nur die Endpunkte jedes Baumes (Variable) enthalten Daten.
Daten können unterschiedlichen Typen angehören, meistens Text (String, REG_SZ), aber auch Binärzahlen (REG_DWORD) oder Binär codierte Werte (REG_BINARY).

Liste - Ausgabe aller Subkeys oder Variablen-Namen

Diese Funktion unterscheidet die Cygwin-Möglichkeriten wesentlich von jenen mit ActiveX. ActiveX / WSH bietet keine Möglichkeit, die Namen von Subkeys oder Variablen zu lesen.

Manueller Test

Befehl regtool mit Option list gibt eine Liste der Namen aller Subkeys oder Variablen eines Schlüssels key aus. Das ist dann besonders wichtig, wenn ein Schlüssel eine variable Anzahl von Subkeys enthält.
Geben sie die Befehle des Beispiels ein - Das $-Zeichen wird bereits von Cygwin eingetragen.
Zur besseren Übersicht wird der Schlüssel-String in der Variablen key schrittweise aufgebaut und danach angezeigt. Shell-Funktionen verwenden für Pfade das / Trennzeichen.
Das Beispiel zeigt die zuletzt verwendeten Dateien einer bestimmten Type an - Allerdings vorläufig nur die Namen und nicht die Werte der Variablen.
An Stelle von exe können sie eine andere Datei-Erweiterung oder * eingeben.
Zuletzt wird mit regtool list die Liste aller Subkeys angezeigt:
Als Ergebnis sehen sie normalerweise den Text MRUList sowie einige Buchstaben.
Zum Vergleich können sie den Registry Editor regedit.exe öffnen und damit den gleichen Schlüssel untersuchen.

$ key="/HKCU/Software"
$ key=$key"/Microsoft"
$ key=$key"/Windows"
$ key=$key"/CurrentVersion"
$ key=$key"/Explorer"
$ key=$key"/ComDlg32"
$ key=$key"/OpenSaveMRU"
$ key=$key"/exe"
$ echo "key=$key"
$ regtool list "$key"

Shell-Alias

Ein kleines Programm nach diesem Beispiel lässt sich als Shell-Alias definieren und in der Konfigurations-Datei permanent speichern:
/home/username/.bashrc
Dieser Pfad wird in der Shell-Konsole relativ zum Cygwin Basis-Verzeichnis angegeben. Er entspricht dem Windows-Pfad
C:\Programme\Cygwin\home\username\.bashrc
Ersetzen sie username durch den Namen des betreffenden Windows-Users bzw. ändern sie den Pfad sinngemäß, wenn sie Cygwin anders installiert haben.

Dieser Text wird am Ende der Datei .bashrc eingefügt:
alias reglist="regtool list '/HKCU/../exe'"
Ergänzen sie den Key-Pfad wie im Beispiel oben oder wie erwünscht.
Nach Eintragung der Alias-Definition kann der Alias-Befehl in jeder neu geöffneten Cygwin-Konsole verwendet werden:
$ reglist

Windows-Script

Die Windows-Konsole kennt keine Alias und kann auch keine Shell-Alias verwenden. Daher wird ein kleines Script-Programm für den Windows commandline interpreter cmd.exe erstellt.
Erzeugen sie in ihrem privaten Programm-Verzeichnis eine Text-Datei
C:\Programme\_myprox\reglist.cmd
und geben sie diesen Text ein.
@echo off
reglist "/HKCU/../exe"
Ergänzen sie den Key-Pfad wie im Beispiel oben.

Nach dem Sichern der Datei reglist.cmd kann der Befehl in jeder Windows-Konsole verwendet werden:
C:\> reglist
Wenn der Befehl nicht funktioniert, probieren sie den vollständigen Pfad:
C:\> c:\programme\_myprox\reglist.cmd
Wenn das funktioniert, ist die Umgebungs-Variable PATH nicht richtig eingestellt. Wenn nicht, haben sie einen Tippfehler gemacht, bzw. ist Cygwin nicht sauber installiert.
Das Beispiel wird auch mit anderen Schlüsseln nur selten in dieser einfachen Form verwendet. Sehen sie im Kapitel Schleife dieser Seite, wie das Beispiel für die Praxis erweitert wird.

Wert - Ausgabe des Wertes einer Registry-Variablen

Manueller Test

Befehl regtool mit Option get gibt den Wert einer einzelnen Variablen key2 aus. Zur besseren Übersicht wird der Schlüssel-String in der Variablen key1 schrittweise aufgebaut und danach angezeigt.
Zuletzt wird der Schlüssel key1 mit einem Variablen-Namen kombiniert. An Stelle von "a" können sie jeden Variablen-Namen einsetzen, der in der Variablen-Liste (Kapitel Liste) angezeigt wurde.
Mit Befehl regtool get wird der Wert der ausgewählten Variablen ausgegeben. Hier wird der Wert an die Variable varval übergeben und anschließend mit echo angezeigt.

$ key1="/HKCU/Software"
$ key1=$key1"/Microsoft"
$ key1=$key1"/Windows"
$ key1=$key1"/CurrentVersion"
$ key1=$key1"/Explorer"
$ key1=$key1"/ComDlg32"
$ key1=$key1"/OpenSaveMRU"
$ key1=$key1"/exe"
echo "key=$key1"
varname="a"
key2=$key1"/$varname"
varval=$(regtool get $key2)
echo "$varname=$varval"
Dieser Befehl eignet sich für die permanente Installation, wenn sich der Name einer Variablen nicht ändert. In diesem Fall erzeugen sie am besten ein Alias in der Konfigurations-Datei, nach dem im Kapitel Liste (oben) gezeigten Muster.
Anschließend legen sie nach dem gleichen Muster eine Datei für den Windows commandline interpreter cmd.exe an.
Danach können sie den selbst erstellten Befehl sowohl in der Cygwin-Shell als auch in der Windows-Konsole verwenden.
In vielen anderen Fällen ist der Name der gesuchten Variablen unbekannt oder variabel:
Dann müssen alle Variablen eines Schlüssels angezeigt oder analysiert werden: Weiter mit dem Kapitel Schleife.
Beispiel für eine Registry-Variable mit einem fixen Namen (zuerst Cygwin-Shell, danach Windows-Konsole)
$ regtool get "/HKCU/Software/Microsoft/Internet Explorer/Main/Start Page"
C:\> regtool get "/HKCU/Software/Microsoft/Internet Explorer/Main/Start Page"
Dieses Beispiel zeigt die eingestelle Homepage des M$IE Browsers an.

Beispiel: IP-Adresse

In diesem Beispiel wird demonstriert, wie man ein Befehl zur Ausgabe der IP-Adresse erstellt. Das ergibt nur für solche PC einen Sinn, die von einem DHCP-Server eine variable IP-Adresse zugewiesen erhalten.

Details zu den Themen IPv4-Adresse, Router + Proxy-Server
Ein Router oder Proxy-Server hat 2 Interface. Interessant ist insbesondere die aktuelle Außen-Adresse, d.h. jene "Masque", hinter der sich aus Sicht des Internet das lokale Netzwerk verbirgt.
(1) Zunächst müssen sie herausfinden, welche internen Codes in der Registry für die Interface vergeben wurden. Sie können den angegebenen Schlüssel mit dem Registry-Editor analysieren oder gleich mit Cygwin:
Dieser Schlüssel enthält normalerweise 2 Einträge je Interface, auf einem Router daher 4 Einträge
$ regtool list "/HKLM/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters/Interfaces"
Die Ausgabe-Liste enthält unübersichtliche Codes, z.B.
{12345678-1234-1234-1234-123456789ABC}
(2) Einer dieser Sub-Schlüssel enthält die gesuchten Daten. Die Eingabe ist mühsam, in diesem Fall einfacher mit dem Registry-Editor.
So finden sie heraus, welcher Schlüssel die gesuchte IP-Adresse enthält:
$ regtool get "HKLM/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters/Interfaces/{*}DhcpIpAddress/"
Ersetzen sie * durch je einen der oben erhaltenen Codes. Notieren sie den {*} Code des gesuchten Schlüssels.
(3) Erstellen sie ein permanentes Cygwin-Alias
Öffnen sie ihre private Konfigurations-Datei
/home/username/.bashrc

Ergänzen sie den Text mit einem neuen Alias-Befehl.
Fügen sie diesen Text am Ende ihrer privaten Cygwin Konfigurations-Datei an:
# Ausgabe der aktuellen Router IP-Adresse
alias get_router_ip="regtool get '/HKLM/../Interfaces/{*}/DhcpIPAddress'"
Ergänzen sie den .. Text zum oben angeführten Schlüssel und ersetzen sie * durch den in (2) gefundenen Code.
(4) Test des fertigen Alias an der Cygwin-Konsole:
$ get_router_ip
38.107.179.212
Dieses Alias kann nur an der Cygwin-Konsole verwendet werden. Daher ist eine Ergänzung für die Windows-Konsole wünschenswert.
(5) Script für die Windows-Konsole
Erstellen sie in ihrem privaten Programm-Verzeichnis eine Text-Datei
C:\Programme\_myprox\get_router_ip.cmd
und tragen sie diesen Text ein:
@echo off
regtool get '/HKLM/../DhcpIPAddress'
Ergänzen sie den .. Text um den oben angeführten Schlüssel und den in (2) gefundenen Code.
Bei richtig eingestellter Konfiguration funktioniert der Befehl nun auch an der Windows-Konsole:
C:\> get_router_ip
38.107.179.212

Schleife - Ausgabe aller Subkeys oder Variablen

In vielen Fällen wird die Ausgabe von regtool list weiter verwendet. Das Ergebnis wird in einer Schleife mit Befehl regtool get weiter verarbeitet.

Das Beispiel verwendet den gleichen Schlüssel wie im Kapitel Liste dieser Seite. Hier werden allerdings nicht die (uninteressanten) systematischen Namen der Variablen ausgegeben sondern die aktuellen Werte.

Funktion regtool_list liefert die Liste mit den Namen der Variablen. Sie wird an die Variable res1 übergeben.
In der for-Schleife wird bei jedem Durchgang ein Element der Liste an die Variable varname übergeben.
Innerhalb der Schleife wird mit Funktion regtool get der Wert je einer Variablen gelesen und ausgegeben.
Dieses Beispiel gibt für einen Schlüssel key1 alle darin enthaltenen Variablen und deren Werte aus:
reg_demo_function() {
key1="/HKCU/Software"
key1=$key1"/Microsoft"
key1=$key1"/Windows"
key1=$key1"/CurrentVersion"
key1=$key1"/Explorer"
key1=$key1"/ComDlg32"
key1=$key1"/OpenSaveMRU"
key1=$key1"/exe"
echo "key=$key1"
res1=$(regtool list $key1)
for varname in $res1; do
key2=$key1"/"$varname
res2=$(regtool get $key2)
echo " $varname=$res2"
done
}
Eine Funktion dieser Form kann als eigener Befehl in der Cygwin-Konsole eingesetzt werden: Anwendung in der Cygwin-(Shell)-Konsole
$ reg_demo_function
Shell Script-Datei
Damit die Funktion auch in der Windows-Konsole eingesetzt werden kann, wird eine Shell Script-Datei erstellt:
Erzeugen sie eine Text-Datei (ohne Datei-Erweiterung), z.B.
C:\Programme\Cygwin\bin\registry_demo
und tragen sie den rechts gezeigten Text ein.
Der "shebang"-Text #!/bin/sh muss in der ersten Zeile stehen, davor darf keine Leerzeile, kein Leerzeichen, Tabulator etc. stehen. Dieser Text bezeichnet nach Linux-Standard den Pfad zum ausführenden Programm - In diesem Fall zu sh.exe
Anwendung in der Cygwin-(Shell)-Konsole:
$ registry_demo
Alternativen:
Die Datei kann auch anders benannt werden, es sollten jedoch keine gleichnamigen Alias oder Funktionen existieren. Die Datei kann auch im Verzeichnis ihrer eigenen Programme angegelgt werden, z.B.
C:\Programme\_myprox\registry_demo
wenn die Umgebungs-Variable PATH diesen Pfad enthält.
Inhalt der Datei registry_demo
#!/bin/sh
key1="/HKCU/Software"
key1=$key1"/Microsoft"
key1=$key1"/Windows"
key1=$key1"/CurrentVersion"
key1=$key1"/Explorer"
key1=$key1"/ComDlg32"
key1=$key1"/OpenSaveMRU"
key1=$key1"/exe"
echo "key=$key1"
res1=$(regtool list $key1)
for varname in $res1; do
key2=$key1"/"$varname
res2=$(regtool get $key2)
echo " $varname=$res2"
done

Windows-Konsole

Öffnen sie eine Windows-Konsole und geben sie als Befehl (=Programm-Name) sh und als Argument den Namen der Script-Datei ein.
Das Programm sollte genauso ausgeführt werden wie an der Cygwin (Shell)-Konsole.
Wenn das Programm nur in der Shell läuft, dann ist Cygwin oder die Windows-Umgebung nicht richtig konfiguriert.

Ausführung eines Shell-Scripts in der Windows-Konsole ('Eingabe-Aufforderung') cmd.exe
C:\> sh registry_demo

 Windows Datei-Type

Für die Windows-Verwendung können sie auch eine eigene Datei-Type SHELL anlegen:
Ändern sie den Namen der Script-Datei auf registry_demo.shell
Öffnen sie ein Verzeichnis (Ordner) und verwenden sie Menü-Befehl Extras | Ordner-Optionen | Dateitypen. Legen sie eine neue Datei-Type SHELL an und ändern sie die Eigenschaft 'Öffnen mit': klicken sie 'Durchsuchen' und tragen sie den Pfad zum Shell-Programm ein:
C:\Programme\Cygwin\bin\sh.exe
Nun lässt sich das Script in der Windows-Konsole durch Angabe seines Datei-Namens starten:
C:\> registry_demo.shell

Ergänzen sie die Umgebungs-Variable PATHEXT und fügen sie am Ende ein ; Trennzeichen und diesen Text an:
;.SHELL
Nun lässt sich das Script auch ohne die Datei-Endung starten:
C:\> registry_demo
Allerdings müssen sie dafür in der Cygwin-(Shell)-Konsole den vollen Dateinamen angeben:
$ registry_demo.shell
Wenn sie für die Shell eine gleichnamige Funktion in der Konfigurations-Datei eintragen, dann können sie den gleichnamigen Befehl registry_demo in jeder Konsole verwenden.

Schreiben, Ändern oder Löschen von Registry-Variablen

Jede unbedachte Änderung von Registry-Daten kann irreparable Schäden an System, Programmen oder Daten bewirken.
Registry-Änderungen sind daher erfahrenen AdministratorInnen vorbehalten !
Konsultieren sie die Hilfe zum Befehl regtool, insbesondere für die Optionen add, set, remove, unset
$ man regtool
Option add erzeugt einen neuen Sub-Schlüssel.
Option remove löscht einen Schlüssel und alle darin enthaltenen Variablen.
Option set schreibt / ändert den Wert einer Variablen.
Option unset löscht den Wert einer Variablen, jedoch nicht die Variable selbst.

Registry-Zugriff auf Umgebungs-Variable

Umgebungs-Variable

enthalten wichtige Daten zur Hardware- und Software-Umgebung. Diese Daten sind für alle Programme und Programmiersprachen in standardisierter Form verfügbar.
Jedes Betriebssystem verwaltet Umgebungs-Variable.
Die Verwendung solcher Daten ermöglicht die Entwicklung System-unabhängiger Programme.
Jedes gestartete Programm erhält von seinem Vorgänger (Parent) einen kompletten Satz eigener 'privater' Umgebungs-Daten. Ein Programm kann seine eigenen Daten verändern, ergänzen und an seine Child-Prozesse weitergeben.

Windows verwaltet je einen kompletten Satz von Umgebungs-Daten für das Betriebssystem (System-Variable, ControlSet001) jeden einzelnen User (Benutzer-Variable, ControlSet002.. ). Bei der Anmeldung (Login) wird aus den System-Daten und aus den User-Daten der aktuelle Variablen-Satz (CurrentControlSet) zusammengestellt.
Daher ist eine Änderung des CurrentControlSet zwar möglich, aber sinnlos - er wird bei der Abmeldung gelöscht und bei Anmeldung neu erstellt.
Verwenden sie den Registry-Editor regedit.exe, um die betreffenden Schlüssel zu untersuchen.
Die Shell-Konsole erhält vom Betriebssystem dessen Umgebungs-Variable im CurrentControlSet, definiert jedoch eigene zusätzliche Variable, die allesamt an Shell Script-Programme übergeben werden.
Rechts der Registry-Schlüssel, in dem die System-Variablen verwaltet werden.
Die übrigen Variablen-Sätze folgen als ControlSet002 usw., danach der aktuell verwendete Satz CurrentControlSet.
Der Registry-Schlüssel für die System-Variablen:
$ kenv="/HKLM/SYSTEM"
$ kenv=$kenv"/ControlSet001"
$ kenv=$kenv"/Control"
$ kenv=$kenv"/Session Manager/"
$ kenv=$kenv"/Environment"
$ echo "kenv=$kenv"

Liste aller Umgebungs-Variablen

Dazu könnten sie eine eigene Shell-Funktion wie im Kapitel Schleife dieser Seite verwenden.
Allerdings bieten Konsolen-Programme und Programmiersprachen dafür eigene Möglichkeiten, die schneller und bequemer arbeiten.
Der Windows-Befehl set kann auch an der Shell-Konsole ausgeführt werden.
Windows-Konsole:
C:\> set
Cygwin-(Shell)-Konsole:
$ printenv | sort
$ declare
$ export
$ set
$ regtool list "$kenv"

Ausgabe von Umgebungs-Variablen

Das Beispiel zeigt die Ausgabe des Wertes einzelner Variabler.
Das Shell-Programm regtool gibt den Original-Wert wieder, so wie in der Registry eingetragen. Windows-Variable wie z.B. %SystemRoot% werden nicht expandiert, d.h. nicht durch ihren aktuellen Windows-Wert ersetzt !
Das Windows-Programm set expandiert Windows-Variable auch bei Verwendung in der Shell.

$ regtool get "$kenv/OS"
$ regtool get "$kenv/windir"

Windows-Programme expandieren Win-Variable:
$ set
C:\> set
C:\> set windir

Eingabe von Umgebungs-Variablen

Im Beispiel wird die Umgebungs-Variable testvariable neu angelegt.
Die eingetragenen Daten sind sofort nach Ausführung des Befehls mit dem Registry Editor regedit.exe oder mit regtool get lesbar.
Registry-Änderungen treten erst nach Abmeldung / Anmeldung oder System-Neustart in Kraft: Erst danach wird die erzeugte Variable an alle Programme übergeben.
Vorsicht - Überschreiben sie keine vorhandenen Variablen !
$ regtool set "$kenv/testvariable" "Das ist ein Test"
$ regtool get "$kenv/testvariable"
In diesen Listen ist die Variable erst nach Neustart enthalten:
$ printenv | sort
C:\> set
So wird die erzeugte Variable wieder gelöscht. Wenn sie mittlerweile eine andere Shell-Session verwenden, dann müssen sie kenv erneut definieren !
$ regtool remove "$kenv/testvariable"