Inhaltsverzeichnis > Objekt-Attribute: Deep Inside > Objekt-Attribute des Typs "Octet String"
Objekt-Attribute des Typs "Octet String"
Dieser Abschnitt des SelfADSI Tutorials widmet sich dem Problem, bei einem beliebigen Verzeichnisobjekt
ALLE Attribute auszulesen, obwohl man nicht weiss, wieviele es davon gibt, welche Bezeichnung sie
haben und in welche Datentypen diese Attribute im Objekt gespeichert sind. Diese Aufgabe soll das
unten aufgeführte Beispiel-Script Enum übernehmen.
Im Script wird der Trick angewendet, die Attribut-Daten nicht auf die normale Art und Weise über
die im Abschnitt "Objekt-Attribute lesen" beschriebenen Techniken
zugegriffen. Vielmehr wird der sogenannte Property Cache benutzt. Dieser wird mit der ADSI-Funktion
GetInfo gefüllt und kann danach mit der Funktion GetPropertyItem zugegriffen werden. Der Vorteil
dieser Herngehensweise: Hier läßt sich das komplette Array der zur Verfügung stehenden
Attribute nach Namen und Datentyp abfragen.
Das eigentliche Auslesen der Daten geschieht dann über verschiedene Techniken, bei Octet-String
Attributen oder Provider Specific Attributen müssen
dazu einige Zusatzfunktionen zur Typ-Umwandlung und zur Darstellung der Daten hinzugezogen werden.
Insgesamt stellt das Script Enum ein gutes Anschauungsbeispiel für alle bisher im SelfADSI-Tutorial
besprochenen Zugriffstechniken für Objekt-Attribute dar:
Set obj = GetObject("LDAP://dc1.cerrotorre.de/cn=user1,cn=users,dc=cerrotorre,dc=de", "administrator", "geheim", 1)
Const ADSTYPE_DN_STRING=1
Const ADSTYPE_CASE_EXACT_STRING = 2
Const ADSTYPE_CASE_IGNORE_STRING = 3
Const ADSTYPE_PRINTABLE_STRING = 4
Const ADSTYPE_NUMERIC_STRING = 5
Const ADSTYPE_BOOLEAN=6
Const ADSTYPE_INTEGER=7
Const ADSTYPE_OCTET_STRING=8
Const ADSTYPE_UTC_TIME=9
Const ADSTYPE_LARGE_INTEGER=10
Const ADSTYPE_PROV_SPECIFIC=11
obj.GetInfo
obj.GetInfoEx Array("createTimeStamp", "modifyTimeStamp"), 0
WScript.Echo obj.name & ": attribute count: " & obj.PropertyCount & vbCrLf
For i = 0 To obj.PropertyCount-1
Select Case obj.Item(i).ADStype
Case ADSTYPE_DN_STRING
attrTypeName = "DNString"
Case ADSTYPE_CASE_EXACT_STRING
attrTypeName = "CaseExact String"
Case ADSTYPE_CASE_IGNORE_STRING
attrTypeName = "CaseIgnore String"
Case ADSTYPE_PRINTABLE_STRING
attrTypeName = "Printable String"
Case ADSTYPE_NUMERIC_STRING
attrTypeName = "Numeric String"
Case ADSTYPE_BOOLEAN
attrTypeName = "Boolean"
Case ADSTYPE_INTEGER
attrTypeName = "Integer"
Case ADSTYPE_OCTET_STRING
attrTypeName = "Octet-String"
Case ADSTYPE_UTC_TIME
attrTypeName = "UTC Time"
Case ADSTYPE_LARGE_INTEGER
attrTypeName = "Large Integer"
Case ADSTYPE_PROV_SPECIFIC
attrTypeName = "Provider Specific"
Case Else
attrTypeName = CStr(obj.item(i).adstype)
End Select
WScript.Echo "__________________________________________________________________"
WScript.Echo obj.Item(i).Name & " (" & attrTypeName & ")"
Select Case obj.Item(i).ADStype
Case ADSTYPE_DN_STRING, ADSTYPE_CASE_EXACT_STRING, ADSTYPE_CASE_IGNORE_STRING, _
ADSTYPE_PRINTABLE_STRING, ADSTYPE_INTEGER, ADSTYPE_NUMERIC_STRING, _
ADSTYPE_UTC_TIME
valuearray = obj.GetEx(obj.Item(i).name)
For Each value In valuearray
WScript.Echo value
Next
Case ADSTYPE_LARGE_INTEGER
valuearray = obj.Getex(obj.Item(i).name)
For Each value In valuearray
WScript.Echo value.HighPart & ":" & value.LowPart
Next
Case ADSTYPE_BOOLEAN
valuearray = obj.GetEx(obj.Item(i).name)
For Each value In valuearray
If (value) Then WScript.Echo "TRUE" Else WScript.Echo "FALSE"
Next
Case ADSTYPE_OCTET_STRING
valuearray = obj.GetEx(obj.Item(i).name)
For Each value In valuearray
hstr = OctetToHexStr(value)
WScript.Echo PrintOutHex(hstr, 16)
Next
Case ADSTYPE_PROV_SPECIFIC
Set prop = obj.GetPropertyItem(obj.Item(i).name, ADSTYPE_OCTET_STRING)
valuearray = prop.Values
For Each value In valuearray
data = value.OctetString
hstr = OctetToHexStr(data)
WScript.Echo PrintOutHex(hstr, 16)
Next
End Select
Next
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:
ADSI-Referenz
im MSDN: Property Cache Interface
Übrigens: In Active Directory Umgebungen werden Attribute eigentlich NIE im Format "Provider
Specific" zurückgegeben, falls doch, liegt eine Fehlfunktion des betreffenden Domänen-Controllers
oder der ADSI-Schnittstelle auf dem Client vor. Bei anderen Verzeichnisdienst-Servern wie z.B.
in eDirectory-Umgebungen werden Sie Provider Specific Attribute jedoch häufiger antreffen.