Printout Header
RSS Feed

Provider Specific Attributes


Mit den im SelfADSI-Artikel "LDAP Objekt-Attribute lesen" beschriebenen Methoden können Sie alle Attribute eines Objekts im Active Directory (oder einem anderen LDAP-Verzeichnis) auslesen und die damit empfangenen Daten in einem Skript weiterverarbeiten.


Problematischer wird es, wenn der Verzeichnis-Server ein Attribut unter dem ADSI-Datentyp "Provider Specific" zurückgibt. Dies kommt in Active Directory Umgebungen nie vor, ist jedoch oft bei Novell eDirectory-Zugriffen (NDS) der Fall und kann auch bei anderen LDAP-Servern vorkommen.


Wenn ein LDAP-Server den Datentyp "Provider Specific" zurückgibt, heißt das soviel wie "kann vom Skript aus nicht genau entschieden werden". Es ist schwierig, diese Attribute auszulesen (das Schreiben dieser Attribute hingegen klappt fast immer ohne Probleme). Versuchen Sie es mit einem normalen Lesezugriff (mit Get oder GetEx), dann bekommen Sie wahrscheinlich die folgende Script-Laufzeitfehlermeldung:


0x8000500C - "The Active Directory datatype cannot be converted to/from a native DS datatype"


Hier hilft nur ein Blick ins Schema des betreffenden Verzeichnisdiensten und eine spezielle Methode, um die Daten in ein für eine Skript brauchbares Format umzuwandeln. Man liest die Daten dazu aus dem lokalen Property-Cache eines verbundenen Verzeichnisobjektes. Dieser wird mit der ADSI-Methode GetInfo gefüllt und kann danach mit GetPropertyItem zugegriffen werden, wobei der Datentyp der ausgelesenen Daten in gewissen Grenzen selbst festgelegt werden kann. Eine vernünftige Vorgehensweise ist es, die Daten stets in der LDAP-Syntax OctetString zu lesen und sie danach in das geeignete Datenformat umzuwandeln.


Const ADSTYPE_OCTET_STRING = 8

Set obj = GetObject("LDAP://nldap.cerrotorre.de/cn=ConsoleOneUpdate,ou=apps,o=cerrotorre", _
                    "cn=supervisor,ou=users,o=cerrotorre", "P@ssw0rd", 0)

obj.GetInfo                                'Attribut-Cache füllen
                                           'Attribut "appPath" als Binärwert aus dem Cache holen
Set prop = obj.GetPropertyItem("appPath", ADSTYPE_OCTET_STRING)
valuearray = prop.Values                   '..es wird immer ein Array zurückgegeben
For Each value In valuearray
    data = value.OctetString               'hier wird der eigentliche Binärwert gelesen

    hstr = OctetToHexStr(data)             'Ausgabe
    WScript.Echo hstr & vbCrLf
    WScript.Echo PrintOutHex(hstr, 16) & vbCrLf
    WScript.Echo HexStrToAscii(hstr, True)
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: Die binären Rohdaten werden erst als purer Hex-String ausgegeben, dann in einem Hex-Editor-ähnlichen Format und zuletzt als ASCII-Text.


ScreenShot Script Output


ADSI-Referenz im MSDN: Property Cache Interface


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.