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.
"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:
"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:
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.
"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:
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 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:
"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 von OctetString.vbs |

