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.
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.

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.

