Printout Header

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:


Set wso = CreateObject("Wscript.Shell")
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:


Set wso = CreateObject("Wscript.Shell")
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:


Set wso = CreateObject("Wscript.Shell")
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_CLASSES_ROOT   = &H80000000
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_CLASSES_ROOT   = &H80000000
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_CLASSES_ROOT   = &H80000000
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:


Set wso = CreateObject("Wscript.Shell")
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:


Set wso = CreateObject("Wscript.Shell")
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_CLASSES_ROOT   = &H80000000
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:


Set wso = CreateObject("Wscript.Shell")
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_CLASSES_ROOT   = &H80000000
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 Script 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:


Regedit Screenshot

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:


If RegExists("HKLM\Software\Cerrotorre\") Then
    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 Script Download von RegExists.vbs