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.