Suchen mit ActiveX-Datenobjekten (ADO)

Das ADO-Modell (ActiveX Data Object) besteht aus Objekten, die in der folgenden Tabelle aufgeführt sind.

Object BESCHREIBUNG
Connection Eine offene Verbindung mit einer OLE DB-Datenquelle wie ADSI.
Befehl Definiert einen bestimmten Befehl, der für die Datenquelle ausgeführt werden soll.
Parameter Eine optionale Auflistung für alle Parameter, die für das Befehlsobjekt bereitgestellt werden sollen.
Recordset Ein Satz von Datensätzen aus einer Tabelle, einem Befehlsobjekt oder einer SQL-Syntax. Ein Recordset kann ohne zugrunde liegendes Verbindungsobjekt erstellt werden.
Feld Eine einzelne Spalte mit Daten in einem Recordset.
Eigenschaft Eine Auflistung von Werten, die vom Anbieter für ADO bereitgestellt werden.
Fehler Enthält Daten zu Datenzugriffsfehlern. Aktualisiert, wenn in einem einzelnen Vorgang ein Fehler auftritt.

Damit ADO mit ADSI kommunizieren kann, müssen mindestens zwei ADO-Objekte vorhanden sein: Connection und RecordSet. Diese ADO-Objekte dienen zur Authentifizierung von Benutzern bzw. zum Aufzählen von Ergebnissen. In der Regel verwenden Sie auch ein Command-Objekt , um eine aktive Verbindung aufrechtzuerhalten, Abfrageparameter wie Seitengröße und Suchbereich anzugeben und eine Abfrage auszuführen. Weitere Informationen zur Suchfiltersyntax finden Sie unter Suchfiltersyntax.

Das Connection-Objekt lädt den OLE DB-Anbieter und überprüft die Benutzeranmeldeinformationen. Rufen Sie in Visual Basic die CreateObject-Funktion mit "ADODB. Connection", um eine instance eines Connection-Objekts zu erstellen, und legen Sie dann die Provider-Eigenschaft des Connection-Objekts auf "ADsDSOObject" fest. "ADODB. Connection" ist die ProgID des Connection-Objekts , und "ADsDSOObject" ist der Name des OLE DB-Anbieters in ADSI. Wenn keine Anmeldeinformationen angegeben sind, werden die Anmeldeinformationen des aktuell angemeldeten Benutzers verwendet.

Im folgenden Codebeispiel wird gezeigt, wie sie eine instance eines Connection-Objekts erstellen.

Set con = CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"

Im folgenden Codebeispiel wird gezeigt, wie sie eine instance eines Connection-Objekts erstellen.

<%
Set con = Server.CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
%>

Im folgenden Codebeispiel wird gezeigt, wie sie eine instance eines Connection-Objekts erstellen. Beachten Sie, dass Sie die ADO-Typbibliothek (msadoXX.dll) als einen der Verweise im Visual Basic-Projekt einschließen müssen.

Dim Con As New Connection
con.Provider = "ADsDSOObject"

Geben Sie Benutzerauthentifizierungsdaten an, indem Sie die Eigenschaften des Connection-Objekts festlegen. In der folgenden Tabelle sind ADSI-unterstützte Benutzerauthentifizierungseigenschaften aufgeführt.

Eigenschaft BESCHREIBUNG
"Benutzer-ID" Eine Zeichenfolge, die den Benutzer identifiziert, dessen Sicherheitskontext beim Ausführen der Suche verwendet wird. Weitere Informationen zum Format der Benutzernamenzeichenfolge finden Sie unter IADsOpenDSObject::OpenDSObject. Wenn nicht angegeben, ist der Standardwert der angemeldete Benutzer oder der Benutzer, der vom aufrufenden Prozess die Identität angenommen hat.
Password Eine Zeichenfolge, die das Kennwort des Benutzers angibt, der durch "Benutzer-ID" identifiziert wird.
"Kennwort verschlüsseln" Ein boolescher Wert, der angibt, ob das Kennwort verschlüsselt ist. Der Standardwert ist FALSE.
"ADSI-Flag" Ein Satz von Flags aus der ADS_AUTHENTICATION_ENUM-Enumeration , die die Bindungsauthentifizierungsoptionen angeben. Der Standardwert ist 0.

Im folgenden Codebeispiel wird gezeigt, wie die Eigenschaften vor dem Erstellen des Command-Objekts festgelegt werden.

Set oConnect = CreateObject("ADODB.Connection")
oConnect.Provider = "ADsDSOObject"
oConnect.Properties("User ID") = stUser
oConnect.Properties("Password") = stPass
oConnect.Properties("Encrypt Password") = True
oConnect.Open "DS Query", stUser, stPass

Das zweite ADO-Objekt ist das Command-Objekt . Die ProgID des Command-Objekts ist "ADODB. Befehl". Mit diesem Objekt können Sie Mithilfe der aktiven Verbindung Abfrageanweisungen und andere Befehle an ADSI ausgeben. Das Command-Objekt verwendet seine ActiveConnection-Eigenschaft , um eine aktive Verbindung aufrechtzuerhalten. Außerdem wird die CommandText-Eigenschaft verwaltet, um von einem Benutzer ausgegebene Abfrageanweisungen zu enthalten. Die Abfrageanweisungen werden entweder im SQL-Dialekt oder im LDAP-Dialekt ausgedrückt.

Die folgenden Codebeispiele zeigen, wie Sie ein Command-Objekt erstellen.

Set command = CreateObject("ADODB.Command")
Set command.ActiveConnection = oConnect
command.CommandText = 
"SELECT AdsPath, cn FROM 'LDAP://DC=Fabrikam,DC=com' WHERE objectClass = '*'"

Schließen Sie im folgenden Codebeispiel die ADO-Typbibliothek (msadoXX.dll) als einen der Verweise ein.

Dim command As New Command
Set command.ActiveConnection = oConnect
command.CommandText = "<LDAP://DC=Fabrikam,DC=com>;(objectClass=*);AdsPath, cn; subTree"

Suchoptionen für das Command-Objekt werden durch Festlegen der Eigenschaft Properties angegeben. In der folgenden Tabelle sind zulässige benannte Eigenschaften für Eigenschaften aufgeführt.

Benannte Eigenschaft BESCHREIBUNG
"Asynchron" Ein boolescher Wert, der angibt, ob die Suche synchron oder asynchron ist. Der Standardwert ist False (synchron). Eine synchrone Suche blockiert, bis der Server das gesamte Ergebnis oder bei einer seitenseitigen Suche die gesamte Seite zurückgibt. Eine asynchrone Suche blockiert, bis eine Zeile der Suchergebnisse verfügbar ist oder die durch die Eigenschaft "Timeout" angegebene Zeit verstrichen ist.
"Ergebnisse zwischenspeichern" Ein boolescher Wert, der angibt, ob das Ergebnis clientseitig zwischengespeichert werden soll. Der Standardwert ist true. ADSI speichert das Resultset zwischen. Das Deaktivieren dieser Option kann für große Resultsets wünschenswert sein.
"Verjagen von Empfehlungen" Ein Wert aus dem ADS_CHASE_REFERRALS_ENUM , der angibt, wie die Suche Empfehlungen verfolgt. Der Standardwert ist ADS_CHASE_REFERRALS_NEVER. Weitere Informationen zu dieser Eigenschaft finden Sie unter Empfehlungen.
"Nur Spaltennamen" Ein boolescher Wert, der angibt, dass die Suche nur den Namen der Attribute abrufen soll, denen Werte zugewiesen wurden. Der Standardwert ist FALSE.
"Deref Aliases" Ein boolescher Wert, der angibt, ob Aliase gefundener Objekte aufgelöst werden. Der Standardwert ist FALSE.
"Seitengröße" Ein ganzzahliger Wert, der das Paging aktiviert und die maximale Anzahl von Objekten angibt, die in einem Resultset zurückgegeben werden sollen. Der Standardwert ist keine Seitengröße. Weitere Informationen finden Sie unter Abrufen großer Resultsets.
"SearchScope" Ein Wert aus der ADS_SCOPEENUM-Enumeration , der den Suchbereich angibt. Der Standardwert ist ADS_SCOPE_SUBTREE.
"Größenbeschränkung" Ein ganzzahliger Wert, der die Größenbeschränkung für die Suche angibt. Für Active Directory gibt der Größengrenzwert die maximale Anzahl zurückgegebener Objekte an. Der Server beendet die Suche, wenn die Größenbeschränkung erreicht ist, und gibt die gesammelten Ergebnisse zurück. Der Standardwert ist keine Beschränkung.
"Sortieren nach" Eine Zeichenfolge, die eine durch Trennzeichen getrennte Liste von Attributen angibt, die als Sortierschlüssel verwendet werden sollen. Diese Eigenschaft funktioniert nur für Verzeichnisserver, die das LDAP-Steuerelement für die serverseitige Sortierung unterstützen. Active Directory unterstützt die Sortiersteuerung, kann sich jedoch auf die Serverleistung auswirken, insbesondere wenn der Ergebnissatz groß ist. Beachten Sie, dass Active Directory nur einen einzelnen Sortierschlüssel unterstützt. Der Standardwert ist keine Sortierung.
"Zeitlimit" Ein ganzzahliger Wert, der das Zeitlimit in Sekunden für die Suche angibt. Wenn das Zeitlimit erreicht ist, beendet der Server die Suche und gibt die kumulierten Ergebnisse zurück. Der Standardwert ist kein Zeitlimit.
"Timeout" Ein ganzzahliger Wert, der den clientseitigen Timeoutwert in Sekunden angibt. Dieser Wert gibt die Zeit an, zu der der Client auf Ergebnisse vom Server wartet, bevor die Suche beendet wird. Der Standardwert ist kein Timeout.

Im folgenden Codebeispiel wird veranschaulicht, wie Suchoptionen festgelegt werden.

Const ADS_SCOPE_ONELEVEL = 1
Const ADS_CHASE_REFERRALS_EXTERNAL = &H40

Dim Com As New Command
 
Com.Properties("Page Size") = 999
Com.Properties("Timeout") = 30     ' Seconds
Com.Properties("searchscope") = ADS_SCOPE_ONELEVEL
Com.Properties("Chase referrals") = ADS_CHASE_REFERRALS_EXTERNAL
Com.Properties("Cache Results") = False     ' Do not cache the result set.

Das dritte ADO-Objekt ist RecordSet. Sie erhalten dieses Objekt, wenn Sie die Execute-Methode für ein Command-Objekt aufrufen. Die primäre Funktion des RecordSet-Objekts besteht darin, das Resultset aufzulisten und die Daten abzurufen. Das Resultset kann Werte für Attribute enthalten, die sowohl einzelne als auch mehrere Werte aufweisen. Das Abrufen eines einwertigen Attributs ist einfach, ähnlich wie das Abrufen des Spaltenwerts in der relationalen Datenbank, z. B.:

Fields('name').Value

Das Abrufen eines Attributs mit mehreren Werten ist jedoch schwieriger. In diesem Fall ist Field.Value ein Array, und Sie müssen die Unter- und Obergrenze des Arrays überprüfen, wie im folgenden Codebeispiel gezeigt.

Set rs = Com.Execute
 
For i = 0 To rs.Fields.Count - 1
    Debug.Print rs.Fields(i).Name, rs.Fields(i).Type
Next i
 
'--------------------------
' Navigate the record set.
'--------------------------
rs.MoveFirst
lstResult.Clear      ' Clear the user interface.
While Not rs.EOF
For i = 0 To rs.Fields.Count - 1
    ' For Multi Value attribute
    If rs.Fields(i).Type = adVariant And Not (IsNull(rs.Fields(i).Value)) Then
        Debug.Print rs.Fields(i).Name, " = "
        For j = LBound(rs.Fields(i).Value) To UBound(rs.Fields(i).Value)
            Debug.Print rs.Fields(i).Value(j), " # "
            lstResult.AddItem rs.Fields(i).Value(j)
        Next j
    Else
        ' For Single Value attribute.
         Debug.Print rs.Fields(i).Name, " = ", rs.Fields(i).Value
         lstResult.AddItem rs.Fields(i).Value
    End If
Next i
rs.MoveNext
Wend

Im folgenden Codebeispiel werden die Benutzerkonten auf einem LDAP-Server deaktiviert.

Dim X as IADs
Dim con As New Connection, rs As New Recordset
Dim MyUser As IADsUser
 
con.Provider = "ADsDSOObject"
con.Open "Active Directory Provider", "CN=Test,CN=Users,DC=Fabrikam,DC=COM,O=INTERNET", "Password"
Set rs = con.Execute("<LDAP://MyMachine/DC=MyDomain,DC=Fabrikam,DC=com>;(objectClass=User);ADsPath;onelevel")
 
While Not rs.EOF
    ' Bind to the object to make changes 
    ' to it because ADO is currently read-only.
    MyUser = GetObject(rs.Fields(0).Value)
    MyUser.AccountDisabled = True
    MyUser.SetInfo
    rs.MoveNext
Wend

Weitere Informationen zum ADO-Objektmodell finden Sie unter Microsoft ActiveX Data Objects.