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 = "DN String"
        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.


Tweet