Printout Header
RSS Feed

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:


ScreenShot Script Output


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.