HowTo: |
Registry-Zugriffe per VBScript |
Folgende Beispiele sind für den Skript-Zugriff auf die Registry sehr lehrreich:
Wert auslesen | Wert schreiben | ||
Enthaltene Werte auflisten | Enthaltene Schlüssel auflisten | ||
Wert / Schlüssel erzeugen | Wert / Schlüssel löschen | ||
Wert /schlüssel prüfen nach Vorhandensein |
Registry-Wert auslesen
Hier benutzen wir die einfache RegRead-Funktion des Windows Script Host Objects:
value = wso.RegRead("HKCU\Software\CerroTorre\SelfADSI\WorkDir")
Als Parameter wir hier der Name eines Registry-Values mitgegeben. Wenn der Standard-Value eines Keys ausgelesen werden soll, dann geben Sie die Pfad-Bezeichnung des Key an, indem Sie als letzten Buchstaben ein "\" verwenden:
value = wso.RegRead("HKCR\.vbs\")
Beachten Sie auch, dass die Bezeichnungen der Registry-Hives mit folgenden Abkürzungen angegeben werden muss:
HKEY_LOCAL_MACHINE............... | HKLM |
HKEY_CURRENT_USER.................. | HKCU |
HKEY_CLASSES_ROOT.................. | HKCR |
HKEY_CURRENT_CONFIG.............. | HKEY_CURRENT_CONFIG |
HKEY_USERS.................................. | HKEY_USERS |
Die einzelnen Registry-Datentypen werden dabei als folgende Script-Datentypen wiedergegeben:
REG_SZ / REG_EXPAND_SZ........... | String |
REG_DWORD.................................. | Integer |
REG_BINARY.................................. | Array of Integers |
REG_MULTI_SZ.............................. | Array of Strings |
Registry-Wert schreiben
Hier benutzen wir die einfache RegWrite-Methode des Windows Script Host Objects:
wso.RegWrite "HKCU\Software\CerroTorre\SelfADSI\WorkDir", "d:\selfadsi", "REG_SZ"
Als Parameter werden hier der Registry-Pfad des betreffenden Wertes, der zu schreibende Inhalt
des Wertes und der Datentyp des Inhalts. Wenn der Standard-Value eines Keys geschrieben werden
soll, dann geben Sie die Pfad-Bezeichnung des Key an, indem Sie als letzten Buchstaben ein "\" verwenden:
Beachten Sie hierbei, dass die Bezeichnungen der Registry-Hives mit folgenden Abkürzungen
angegeben werden muss:
HKEY_LOCAL_MACHINE............... | HKLM |
HKEY_CURRENT_USER.................. | HKCU |
HKEY_CLASSES_ROOT.................. | HKCR |
HKEY_CURRENT_CONFIG.............. | HKEY_CURRENT_CONFIG |
HKEY_USERS.................................. | HKEY_USERS |
Die einzelnen Registry-Datentypen werden dabei als folgende Script-Datentypen wiedergegeben:
REG_SZ / REG_EXPAND_SZ........... | String |
REG_DWORD.................................. | Integer |
REG_BINARY.................................. | Array of Integers |
Achtung: Mit der RegWrite-Methode können keine Multi-String-Values geschrieben werden (Datentyp REG_MULTI_SZ). Hier müssen wir die SetMultiStringValue Methode des Registry-Providers der WMI-Schnittstelle zur Hilfe nehmen:
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005
Set reo = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
regKey = "SOFTWARE\CerroTorre\SelfADSI\"
regValue = "Multi"
multiString = Array("Eins", "Zwei", "Drei", "Vier")
reo.SetMultiStringValue HKEY_LOCAL_MACHINE, regKey, regValue, multiString
Beachten Sie, dass Sie den Pfad des zu setzenden Values in drei Teilen angeben müssen: Des Standard-Wertes für den Registry-Hive, dem Unterpfad und dem Wertnamen selbst.
Enthaltene Registry-Werte auflisten
Hier müssen wir die EnumValues-Methode des Registry-Provider der WMI-Schnittstelle zur Hilfe nehmen:
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005
Set reo = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
regKey = "SOFTWARE\CerroTorre\SelfADSI\"
reo.EnumValues HKEY_LOCAL_MACHINE, regKey, valueNames, valueTypes
Const REG_SZ = 1
Const REG_EXPAND_SZ = 2
Const REG_BINARY = 3
Const REG_DWORD = 4
Const REG_MULTI_SZ = 7
For e=0 To UBound(valueNames)
WScript.Echo valueNames(e)
Select Case valueTypes(e)
Case REG_SZ
WScript.Echo " String"
Case REG_EXPAND_SZ
WScript.Echo " Expanded String"
Case REG_BINARY
WScript.Echo " Binary"
Case REG_DWORD
WScript.Echo " DWORD"
Case REG_MULTI_SZ
WScript.Echo " Multi String"
End Select
Next
Der entscheidende Aufruf EnumValues besitzt vier Parameter: Zuerst muss man durch eine Systemkonstante angeben, in welchem Registry-Hauptast man die Werte auflisten will. Danach den verbleibenden Unterpfad. Als letztes müssen zwei leere Array-Variablen übergeben werden, diese werden mit den Namen der Werte und deren Datentypen (kodiert in Zahlen) aufgefüllt.
Enthaltene Registry-Schlüssel auflisten
Hier müssen wir die EnumKey-Methode des Registry-Provider der WMI-Schnittstelle zur Hilfe nehmen:
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005
Set reo = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
regKey = "SOFTWARE\CerroTorre\SelfADSI\"
reo.EnumKey HKEY_LOCAL_MACHINE, regKey, keyNames
For e=0 To UBound(keyNames)
WScript.Echo keyNames(e)
Next
Der entscheidende Aufruf EnumKeys besitzt drei Parameter: Zuerst muss man durch eine Systemkonstante angeben, in welchem Registry-Hauptast man die Werte auflisten will. Danach den verbleibenden Unterpfad. Als letztes müssen zwei leere Array-Variablen übergeben werden, diese werden mit den Namen der Werte und deren Datentypen (kodiert in Zahlen) aufgefüllt.
Registry-Wert/Schlüssel erzeugen
Hier benutzen wir wie beim Schreiben eines einzelnen Wertes die einfache RegWrite-Methode des Windows Script Host Objects:
wso.RegWrite "HKCU\Software\CerroTorre\SelfADSI\WorkDir", "d:\selfadsi", "REG_SZ"
Als erster Parameter wird hier der Registry-Pfad des zu erzeugenden Schlüssels oder Wert
angegeben, Außerdem noch der zu schreibende Inhalt des Wertes und der Datentyp des Inhalts.
Wenn der hier angegebene Registry-Pfad mit einem Backslash endet, dann wird kein Wert erzeugt,
sondern ein Unterschlüssel, für den dann ein entsprechender Standard-Wert gesetzt wird
(der auch ein NullString sein kann). In diesem Fall braucht dann der Datentyp des dritten Parameters
nicht angegeben werden:
wso.RegWrite "HKCU\Software\CerroTorre\SelfADSI\SubKey\", ""
Wenn die im Pfad angegebenen darüberliegenden Registry-Schlüssel nicht vorhanden sind, werden Sie beim Aufruf der RegWrite Methode mit erzeugt. Beachten Sie auch, dass die Bezeichnungen der Registry-Hives mit folgenden Abkürzungen angegeben werden muss:
HKEY_LOCAL_MACHINE............... | HKLM |
HKEY_CURRENT_USER.................. | HKCU |
HKEY_CLASSES_ROOT.................. | HKCR |
HKEY_CURRENT_CONFIG.............. | HKEY_CURRENT_CONFIG |
HKEY_USERS.................................. | HKEY_USERS |
Die einzelnen Registry-Datentypen werden dabei als folgende Script-Datentypen wiedergegeben:
REG_SZ / REG_EXPAND_SZ........... | String |
REG_DWORD.................................. | Integer |
REG_BINARY.................................. | Array of Integers |
Achtung: Mit der RegWrite-Methode können keine Multi-String-Values erzeugt werden (Datentyp REG_MULTI_SZ). Hier müssen wir den Registry-Provider der WMI-Schnittstelle zur Hilfe nehmen:
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005
Set reo = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
regKey = "SOFTWARE\CerroTorre\SelfADSI\"
regValue = "Multi"
multiString = Array("Eins", "Zwei", "Drei", "Vier")
reo.SetMultiStringValue HKEY_LOCAL_MACHINE, regKey, regValue, multiString
Beachten Sie, dass Sie den Pfad des zu setzenden Values in drei Teilen angeben müssen: Des Standard-Wertes für den Registry-Hive, dem Unterpfad und dem Wertnamen selbst.
Registry-Wert/Schlüssel löschen
Hier benutzen wir die einfache RegDelete-Methode des Windows Script Host Objects:
wso.RegDelete "HKCU\Software\CerroTorre\SelfADSI\WorkDir"
Wenn Sie einen Wert löschen wollen, dann geben Sie dessen Registry-Pfad ohne einen Backslash
am Ende an. Bei der Löscheung eines Registry-Keys (Backslash steht am Ende des Registry-Pfades)
müssen Sie beachten, dass dies nur gelingt, wenn im betreffenden Key nichts mehr enthalten
ist.
Komplizierter wird´s, wenn man einen gesamten Schlüssel mit Unterschlüsseln und
Werten löschen will. Die oben gezeigte Routine löscht nämlich keine Schlüssel,
in denen noche etwas enthalten ist! Also müssen wir in einer die enthaltenen Elemente aufzählen
und dann rekursiv löschen:
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005
regKey = "SOFTWARE\CerroTorre\SelfADSI\"
RegDeleteTree HKEY_LOCAL_MACHINE, regKey
Sub RegDeleteTree(hiveParam, keyParam)
Dim aSubKeys, strKey, strSubKey, ccode, reo ' get the registry WMI provider
Set reo = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
' we add a backslash in tail
If (Right(keyParam,1)<>"\") Then keyParam = keyParam & "\"
On Error Resume Next ' deactivate RunTime Errors
ccode = reo.EnumKey(hiveParam, keyParam, aSubKeys) ' check for key content
If ccode = 0 And IsArray(aSubKeys) Then
For Each strSubKey In aSubKeys
If Err.Number <> 0 Then ' wrong key or other error => exit
Err.Clear
Exit Sub
End If
RegDeleteTree hiveParam, keyParam & strSubKey ' for each content do recursion
Next
End If
reo.DeleteKey hiveParam, keyParam ' last action: delete the key
End Sub
Download von RegDeleteTree.vbs |
Registry-Wert/Schlüssel prüfen nach Vorhandensein
Ob ein Registry-Wert vorhanden ist, prüfen wir einfach mit der RegRead-Funktion
des Windows Script Host Objects. Vorher wird die Laufzeitfehlerbehandlung mit "On Error
Resume Next" aktiviert und nach einem Leseversuch auf den betreffenden Wert wird der Error-Code
überprüft. Ist dieser gleich Null, so ist der Wert vorhanden.
Es ist allerdings gar nicht so trivial, das Vorhandensein eines Keys (also eines Registry-"Verzeichnisses")
zu ermitteln. Denn ein Auslesen eines Registry-Keys mit RegRead ergibt nur dann einen Rückgabewert
von Null, wenn sich in dem Key ein Standard-Wert befindet:
Wenn dieser Wert nicht vorhanden ist, dann kommt der FehlerCode -2147024894 / 0x80070002 "Value
not found" zurück. Dieser Wert kommt aber auch zurück, wenn der gesamte Key nicht
vorhanden ist. Man kann also schlecht unterscheiden, ob der Key nicht da ist oder nur der Standard-Wert
darin nicht gesetzt ist.
Abhilfe schafft hier die genaue Untersuchung der Fehlerbeschreibung, die man bei der VBScript-Fehlerbehandlung
in der System-Variablen Err.Descrition geliefert bekommt. Bei deutschen Windows-Versionen wird
hier z.B. "Ungültige Wurzel in Registrierungsschlüssel ..." zurückgegeben.
Um uns unabhängig von der speziellen Fehlermeldung zu machen, gehen wir wie folgt vor: Wir
versuchen, einen tatsächlich nicht existierenden Dummy-Schlüssel zu lesen. Hier merken
wir uns die Laufzeitfehlerbschreibung. Wenn beim Lese-Versuch für unseren eigenen Schlüssel
der gleiche Fehlertext kommt, dann ist dieser nicht vorhanden, ansonsten schon:
WScript.Echo "Key ist vorhanden"
Else
WScript.Echo "Key ist nicht vorhanden"
End If
Function RegExists(regPath)
Dim wso, value, errString
On Error Resume Next ' deactivate runtime errors
RegExists = False ' set default=False
Set wso = CreateObject("Wscript.Shell")
If (Right(regPath, 1) <> "\") Then ' check for Reg Value
value = wso.RegRead(regPath) ' try to read
If (Err.Number=0) Then RegExists = True
Else ' check for Reg Key
value = wso.RegRead("HKLM\Dummy\") ' get the error description text
errString = Replace(Err.Description, """HKLM\Dummy\"".", "" )
value = wso.RegRead(regPath) ' try to read
If (Err.Number=0) Then ' success?
RegExists = True
Else ' or same description ?
If Replace(Err.Description, """" & regPath & """.", "" ) <> errString Then
RegExists = True
End If
End If
End If
Set wso = Nothing ' cleanup
On Error Goto 0
End Function
Download von RegExists.vbs |