Inhaltsverzeichnis > Objekt-Attribute: Deep Inside > LDAP Objekt Attribute vom Typ "Octet String"
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
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:
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:
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:
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