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) data = obj.Get("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 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 Function PrintoutHex(var_hex, width) 'Nimmt einen Hex-String und gibt ihn wie in einem Hex-Editor aus 'Der "width" Parameter betimmt, wieviele Bytes in jeder Zeile dargestellt werden 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) 'Wandelt einen HEx-String in die entsprechende lesbare ASCII-Form um 'Wenn 'format'=TRUE, werden Tabs und Zeilenumbr?che im Ergebnis dargestellt 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.


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