Share via


Buscar con objetos de datos ActiveX (ADO)

El modelo de objeto de datos ActiveX (ADO) consta de objetos enumerados en la tabla siguiente.

Object Descripción
Connection Una conexión abierta a un origen de datos OLE DB, como ADSI.
Comando Define un comando específico que se ejecutará en el origen de datos.
Parámetro Colección opcional para los parámetros que se van a proporcionar al objeto de comando.
Recordset Conjunto de registros de una tabla, un objeto de comando o una sintaxis SQL. Se puede crear un conjunto de registros sin ningún objeto de conexión subyacente.
Campo Una sola columna de datos de un conjunto de registros.
Propiedad Colección de valores proporcionados por el proveedor para ADO.
Error Contiene datos sobre errores de acceso a datos. Se actualiza cuando se produce un error en una sola operación.

Para que ADO se comunique con ADSI, debe haber, al menos, dos objetos ADO: Connection y RecordSet. Estos objetos de ADO sirven para autenticar a los usuarios y enumerar los resultados, respectivamente. Normalmente, también usará un objeto Command para mantener una conexión activa, especificar parámetros de consulta, como el tamaño de página y el ámbito de búsqueda, y realizar una consulta. Para obtener más información sobre la sintaxis del filtro de búsqueda, vea Sintaxis de filtro de búsqueda.

El objeto Connection carga el proveedor OLE DB y valida las credenciales de usuario. En Visual Basic, llame a la función CreateObject con "ADODB. Connection" para crear una instancia de un objeto Connection y, a continuación, establezca la propiedad Provider del objeto Connection en "ADsDSOObject". "ADODB. Connection" es el ProgID del objeto Connection y "ADsDSOObject" es el nombre del proveedor OLE DB en ADSI. Si no se especifica ninguna credencial, se usan las credenciales del usuario que ha iniciado sesión actualmente.

En el ejemplo de código siguiente se muestra cómo crear una instancia de un objeto Connection .

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

En el ejemplo de código siguiente se muestra cómo crear una instancia de un objeto Connection .

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

En el ejemplo de código siguiente se muestra cómo crear una instancia de un objeto Connection . Tenga en cuenta que debe incluir la biblioteca de tipos de ADO (msadoXX.dll) como una de las referencias del proyecto de Visual Basic.

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

Especifique los datos de autenticación de usuario estableciendo las propiedades del objeto Connection . En la tabla siguiente se enumeran las propiedades de autenticación de usuario compatibles con ADSI.

Propiedad Descripción
"Id. de usuario" Cadena que identifica al usuario cuyo contexto de seguridad se usa al realizar la búsqueda. Para obtener más información sobre el formato de la cadena de nombre de usuario, vea IADsOpenDSObject::OpenDSObject. Si no se especifica, el valor predeterminado es el usuario que ha iniciado sesión o el usuario lo suplanta el proceso de llamada.
"Password" Cadena que especifica la contraseña del usuario identificado por "Id. de usuario".
"Cifrar contraseña" Valor booleano que especifica si la contraseña está cifrada. El valor predeterminado es false.
"Marca ADSI" Conjunto de marcas de la enumeración ADS_AUTHENTICATION_ENUM que especifican las opciones de autenticación de enlace. El valor predeterminado es cero.

En el ejemplo de código siguiente se muestra cómo se establecen las propiedades antes de crear el objeto Command .

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

El segundo objeto ADO es el objeto Command . El ProgID del objeto Command es "ADODB. Comando". Este objeto permite emitir instrucciones de consulta y otros comandos a ADSI mediante la conexión activa. El objeto Command usa su propiedad ActiveConnection para mantener una conexión activa. También mantiene la propiedad CommandText para contener instrucciones de consulta emitidas por un usuario. Las instrucciones de consulta se expresan en el dialecto SQL o en el dialecto LDAP.

En los ejemplos de código siguientes se muestra cómo crear un objeto Command .

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

En el ejemplo de código siguiente, incluya la biblioteca de tipos de ADO (msadoXX.dll) como una de las referencias.

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

Las opciones de búsqueda del objeto Command se especifican estableciendo la propiedad Properties . En la tabla siguiente se enumeran las propiedades con nombre aceptables para Propiedades.

Propiedad con nombre Descripción
"Asincrónico" Valor booleano que especifica si la búsqueda es sincrónica o asincrónica. El valor predeterminado es False (sincrónico). Una búsqueda sincrónica se bloquea hasta que el servidor devuelve todo el resultado, o para una búsqueda paginada, toda la página. Una búsqueda asincrónica se bloquea hasta que transcurre una fila de los resultados de búsqueda o hasta que transcurre la hora especificada por la propiedad "Timeout".
"Resultados de caché" Valor booleano que especifica si el resultado se debe almacenar en caché en el lado cliente. El valor predeterminado es true; ADSI almacena en caché el conjunto de resultados. La desactivación de esta opción puede ser deseable para grandes conjuntos de resultados.
"Referencias de Chase" Valor de la ADS_CHASE_REFERRALS_ENUM que especifica cómo las referencias de búsqueda persiguen. El valor predeterminado es ADS_CHASE_REFERRALS_NEVER. Para obtener más información sobre esta propiedad, vea Referencias.
"Solo nombres de columna" Valor booleano que indica que la búsqueda debe recuperar solo el nombre de los atributos a los que se han asignado los valores. El valor predeterminado es false.
"Deref Alias" Valor booleano que especifica si se resuelven alias de objetos encontrados. El valor predeterminado es false.
"Tamaño de página" Valor entero que activa la paginación y especifica el número máximo de objetos que se van a devolver en un conjunto de resultados. El valor predeterminado no es ningún tamaño de página. Para obtener más información, vea Recuperar conjuntos de resultados grandes.
"SearchScope" Valor de la enumeración ADS_SCOPEENUM que especifica el ámbito de búsqueda. El valor predeterminado es ADS_SCOPE_SUBTREE.
"Límite de tamaño" Valor entero que especifica el límite de tamaño de la búsqueda. Para Active Directory, el límite de tamaño especifica el número máximo de objetos devueltos. El servidor deja de buscar cuando se alcanza el límite de tamaño y devuelve los resultados acumulados. El valor predeterminado no es ningún límite.
"Ordenar" Cadena que especifica una lista separada por comas de atributos que se van a usar como claves de ordenación. Esta propiedad solo funciona para los servidores de directorios que admiten el control LDAP para la ordenación del lado servidor. Active Directory admite el control de ordenación, pero puede afectar al rendimiento del servidor, especialmente si el conjunto de resultados es grande. Tenga en cuenta que Active Directory solo admite una clave de ordenación única. El valor predeterminado no es ninguna ordenación.
"Límite de tiempo" Valor entero que especifica el límite de tiempo, en segundos, para la búsqueda. Cuando se alcanza el límite de tiempo, el servidor deja de buscar y devuelve los resultados acumulados. El valor predeterminado no es un límite de tiempo.
"Tiempo de espera" Valor entero que especifica el valor de tiempo de espera del lado cliente, en segundos. Este valor indica el tiempo en que el cliente espera los resultados del servidor antes de detener la búsqueda. El valor predeterminado no es el tiempo de espera.

En el ejemplo de código siguiente se muestra cómo establecer las opciones de búsqueda.

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.

El tercer objeto ADO es RecordSet. Este objeto se obtiene al invocar el método Execute en un objeto Command . La función principal del objeto RecordSet es enumerar el conjunto de resultados y obtener los datos. El conjunto de resultados puede contener valores para los atributos que tienen ambos valores únicos o varios. Obtener un atributo de un solo valor es sencillo, similar a obtener el valor de columna en la base de datos relacional, por ejemplo:

Fields('name').Value

Sin embargo, obtener un atributo con varios valores es más complicado. En este caso, Field.Value es una matriz y debe comprobar el límite inferior y superior de la matriz, como se muestra en el ejemplo de código siguiente.

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

En el ejemplo de código siguiente se deshabilitan las cuentas de usuario en un servidor LDAP.

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

Para obtener más información sobre el modelo de objetos de ADO, vea Microsoft ActiveX Data Objects.