Printout Header
RSS Feed

LDAP Objekt Attribute vom Typ "Octet String"


Beim Auslesen und Schreiben von LDAP Objekt-Attributen aus dem Verzeichnis stellen Attribute des Typs Octet-String eine besondere Herausforderung dar. Bei Octet-String handelt es sich um eine LDAP-Syntax, also ein standardisierter Datentyp für Verzeichnis-Attribute, so wie z.B. Integer oder String. Ein Octet-String Attribut besteht aus einem Byte-Array, es sind also reine Binär-Daten, die gelesen oder geschrieben werden.


Auslesen von Octet-String Attributen
Schreiben von Octet-String Attributen



Auslesen von Octet-String Attributen


Das Problem: Wenn man versucht, LDAP-Attribute mit der Syntax Octet String aus einem VBScript heraus zu lesen, dann läßt sich mit diesen Daten nur sehr schlecht umgehen. Beim Versuch, sie auf normale Weise auszugeben, kommen z.B. unsinnige Werte heraus. Ein Beispiel: Wir wollen die Security ID (SID) eines Active Directory Benutzers auslesen und anzeigen. Es handelt sich dabei normalerweise um einen 28 Byte langen Binärwert.


Set obj = GetObject("LDAP://dc1.cerrotorre.de/cn=user1,cn=users,dc=cerrotorre,dc=de", _
                    "administrator", "P@ssw0rd", 1)

data = obj.Get("objectSid")
WScript.Echo data

Das Script schafft es jedoch nicht, den Wert der SID korrekt auszugeben:


Screenshot Script Output


Wir brauchen also eine Funktion, die die hexadezimalen Rohdaten in ein Format umwandelt, mit dem wir besser umgehen können: einen HexString, d.h. die String-Repräsentation der Daten in hexadezimaler Schreibweise. Jedes Byte wird dabei durch seinen hexadecimalen Wert (zwei Buchstben) ausgeschrieben. Dies kann die Funktion OctetToHexStr erledigen:


Set obj = GetObject("LDAP://dc1.cerrotorre.de/cn=user1,cn=users,dc=cerrotorre,dc=de", _
                    "administrator", "P@ssw0rd", 1)

"objectSid")
WScript.Echo OctetToHexStr(data)


Function OctetToHexStr(var_octet)
                'Wandelt reine Binärdaten (Byte-Array) in einen String mit den Hexadezimalwerten um.
Dim n
    OctetToHexStr = ""
    For n = 1 To lenb(var_octet)
        OctetToHexStr = OctetToHexStr & Right("0" & hex(ascb(midb(var_octet, n, 1))), 2)
    Next
End Function

Die Ausgabe sieht diesmal besser aus:


Screenshot Script Output


Um die Ausgabe noch ein wenig zu verschönern, bauen wir eine Funktion ein, die die Daten ähnlich aussehen läßt wie in einem Hex-Editor: Auf der linken Seite sieht man die einzelnen Byte-Werte, rechts davon die jeweiligen ASCII-Daten. Die Funktion nennen wir PrintOutHex, sie benötigt noch eine Hilfsfunktion namens HexStrToAscii, nicht druckbare ASCII-Werte werden als Punkt dargestellt.


Set obj = GetObject("LDAP://dc1.cerrotorre.de/cn=user1,cn=users,dc=cerrotorre,dc=de", _
                    "administrator", "P@ssw0rd", 1)

hstr = OctetToHexStr(obj.Get("objectSid"))
WScript.Echo hstr & vbCrLf
WScript.Echo PrintOutHex(hstr, 8)


Function OctetToHexStr(var_octet)
                'Wandelt reine Binärdaten (Byte-Array) in einen String mit den Hexadezimnalwerten um.
Dim n
    OctetToHexStr = ""
    For n = 1 To lenb(var_octet)
        OctetToHexStr = OctetToHexStr & Right("0" & hex(ascb(midb(var_octet, n, 1))), 2)
    Next
End Function


Function PrintoutHex(var_hex, width)
                'Liefert einen Editor-formatierten String von einem HexString
                'Der width-Parameter bestimmt die Anzahl der Bytes pro Linie.
Dim k1, k2, s1, s2
    PrintOutHex = ""
    For k1 = 1 To Len(var_hex) Step (width *2)
        s1 = Mid(var_hex, k1, (width *2))
        s2 = ""
        s3 = HexStrToAscii(s1, False)
            For k2 = 1 To Len(s1) Step 2
                s2 = S2 & Mid(S1, k2, 2) & " "
            Next
        s2 = s2 & String((width *3)-Len(s2), " ")
        If (k1=1) Then
            PrintOutHex = PrintOutHex & s2 & "| " & s3
        Else
            PrintOutHex = PrintOutHex & vbcrlf & s2 & "| " & s3
        End If
    Next
End Function


Function HexStrToAscii(var_hex, format)
                'Konvertiert einen HexString in einen ASCII String.
                'Ist 'format'=TRUE, dann werden Tabs und Zeilenumbrüche eingefügt
Dim k, v
    HexStrToAscii = ""
    For k = 1 To Len(var_hex) Step 2
        v = CInt("&H" & Mid(var_hex, k, 2))
        If ((v>31) And (v<128)) Then
            HexStrToAscii = HexStrToAscii & (chr(v))
        Else
            If (format) Then
                Select Case v
                    Case 8
                        HexStrToAscii = HexStrToAscii & vbTab
                    Case 10
                        HexStrToAscii = HexStrToAscii & vbCrLf
                    Case 13
                    Case Else
                        HexStrToAscii = HexStrToAscii & "."
                End Select
            Else
                HexStrToAscii = HexStrToAscii & "."
            End If
        End If
    Next
End Function

Das Ergebnis:


Screenshot Script Output


Die Hilfsfunktion HexStrToAscii kann mit dem Parameter format=TRUE auch dazu verwendet werden, Binärdaten auszugeben, die eigentlich ASCII-Texte enthalten, z.B. loginScript-Attribute in eDirectory-Umgebungen.


In der VBScript-Datei Octet.vbs sind alle hier beschriebenen Script-Funktionenenthalen , die man für den Umgang mit Octet-String Attributen braucht:


Download Download von OctetString.vbs

Schreiben von Octet-String Attributen


Das Schreiben von LDAP-Attributen der Syntax "Octet-String" ist vom Visual Basic Script aus noch etwas schwieriger als das Lesen. Denn auch hier haben wir keinen Datentyp "Byte Array" (wie im echten Visual Basic), unter Umständen möchte man aber die durch einen Hex-String repräsentierten Daten wieder in eine Attribut zurückschreiben. Dies ist gar nicht so einfach.


Der Trick, um einen Hexstring in pure Byte-Rohdaten zu verwandeln, gelingt so: Man schreibt die Daten in eine temporäre Datei und liest aus dieser Datei die Daten über einen Stream-Datentyp wieder ein. Danach hat man sie im richtigen Format:


Set obj = GetObject("LDAP://dc1.cerrotorre.de/cn=user1,cn=users,dc=cerrotorre,dc=de", _
                    "administrator", "P@ssw0rd", 1)

data = HexStrToOctet("005a3e11c90026f10043")
obj.Put "sIDHistory", data
obj.SetInfo


Function HexStrToOctet(var_hex)
Dim fso, stream, temp, ts, n
    Set fso = CreateObject ("Scripting.Filesystemobject")
    Set stream = CreateObject ("adodb.stream")
    temp = fso.gettempname ()

    Set ts = fso.createtextfile(temp)
    For n = 1 To (Len(var_hex) - 1) Step 2
        ts.write Chr("&H" & Mid(var_hex, n, 2))
    Next

    ts.close
    stream.type = 1
    stream.open
    stream.loadfromfile temp
    HexStrToOctet = stream.read

    stream.close
    fso.deletefile temp
    Set stream = Nothing
    Set fso = Nothing
End function

In der VBScript-Datei Octet.vbs sind alle hier beschriebenen Script-Funktionenenthalen , die man für den Umgang mit Octet-String LDAP Attributen braucht:


Download Download von OctetString.vbs