| 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
►
Die Umgebungs-Variable PATH sollte folgende Pfade enthalten:C:\> echo %cyg% C:\> regtool • 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
Bei sauberer Installation funktionieren Hilfe und das
Dienstprogramm regtool auch auf der Windows-Konsole:
$ info regtool 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:
► 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 TestBefehl 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-AliasEin 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-ScriptDie 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
Ergänzen sie den Key-Pfad wie im Beispiel oben.
reglist "/HKCU/../exe" |
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 TestBefehl 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"
Dieses Beispiel zeigt die eingestelle Homepage des M$IE Browsers an.
C:\> regtool get "/HKCU/Software/Microsoft/Internet Explorer/Main/Start Page" |
|
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
Ergänzen sie den .. Text zum oben angeführten
Schlüssel und ersetzen sie * durch den in (2) gefundenen Code.
alias get_router_ip="regtool get '/HKLM/../Interfaces/{*}/DhcpIPAddress'" |
|
|
(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
Ergänzen sie den .. Text um den oben angeführten
Schlüssel und den in (2) gefundenen Code.
regtool get '/HKLM/../DhcpIPAddress' |
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
done
res2=$(regtool get $key2) echo " $varname=$res2" |
| 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
done
res2=$(regtool get $key2) echo " $varname=$res2" |
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-TypeFü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 . 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.
|
Registry-Zugriff auf Umgebungs-Variable |
|
Umgebungs-Variableenthalten 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-VariablenDazu 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-VariablenDas 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-VariablenIm 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"
In diesen Listen ist die Variable erst nach Neustart enthalten:
$ regtool get "$kenv/testvariable"
$ printenv | sort
So wird die erzeugte Variable wieder gelöscht. Wenn sie mittlerweile eine andere
Shell-Session verwenden, dann müssen sie kenv erneut definieren !
C:\> set $ regtool remove "$kenv/testvariable"
|
|