Pesquisando com ActiveX Data Objects (ADO)
O modelo ActiveX Data Object (ADO) consiste em objetos listados na tabela a seguir.
Objeto | Descrição |
---|---|
Conexão | Uma conexão aberta com uma fonte de dados OLE DB, como ADSI. |
Comando | Define um comando específico a ser executado na fonte de dados. |
Parâmetro | Uma coleção opcional para quaisquer parâmetros a serem fornecidos ao objeto de comando. |
Conjunto de Registros | Um conjunto de registros de uma tabela, objeto de comando ou sintaxe SQL. Um conjunto de registros pode ser criado sem qualquer objeto de conexão subjacente. |
Campo | Uma única coluna de dados em um conjunto de registros. |
Propriedade | Uma coleção de valores fornecidos pelo provedor para o ADO. |
Erro | Contém dados sobre erros de acesso a dados. Atualizado quando ocorre um erro em uma única operação. |
Para que o ADO se comunique com o ADSI, deve haver, pelo menos, dois objetos ADO: Connection e RecordSet. Esses objetos ADO servem para autenticar usuários e enumerar resultados, respectivamente. Normalmente, você também usará um objeto Command para manter uma conexão ativa, especificar parâmetros de consulta, como tamanho da página e escopo de pesquisa, e executar uma consulta. Para obter mais informações sobre a sintaxe do filtro de pesquisa, consulte Sintaxe do filtro de pesquisa.
O objeto Connection carrega o provedor OLE DB e valida as credenciais do usuário. No Visual Basic, chame a função CreateObject com "ADODB. Connection" para criar uma instância de um objeto Connection e, em seguida, defina a propriedade Provider do objeto Connection como "ADsDSOObject". "ADODB. Connection" é o ProgID do objeto Connection e "ADsDSOObject" é o nome do provedor OLE DB no ADSI. Se nenhuma credencial for especificada, as credenciais do usuário conectado no momento serão usadas.
O exemplo de código a seguir mostra como criar uma instância de um objeto Connection .
Set con = CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
O exemplo de código a seguir mostra como criar uma instância de um objeto Connection .
<%
Set con = Server.CreateObject("ADODB.Connection")
con.Provider = "ADsDSOObject"
%>
O exemplo de código a seguir mostra como criar uma instância de um objeto Connection . Lembre-se de que você deve incluir a biblioteca de tipos ADO (msadoXX.dll) como uma das referências no projeto Visual Basic.
Dim Con As New Connection
con.Provider = "ADsDSOObject"
Especifique os dados de autenticação do usuário definindo as propriedades do objeto Connection . A tabela a seguir lista as propriedades de autenticação de usuário suportadas pelo ADSI.
Propriedade | Descrição |
---|---|
"ID do usuário" | Uma cadeia de caracteres que identifica o usuário cujo contexto de segurança é usado ao executar a pesquisa. Para obter mais informações sobre o formato da cadeia de caracteres de nome de usuário, consulte IADsOpenDSObject::OpenDSObject. Se não for especificado, o padrão será o usuário conectado ou o usuário representado pelo processo de chamada. |
"Password" | Uma cadeia de caracteres que especifica a senha do usuário identificado por "ID do usuário". |
"Criptografar senha" | Um valor booleano que especifica se a senha é criptografada. O padrão é false. |
"Bandeira ADSI" | Um conjunto de sinalizadores da enumeração ADS_AUTHENTICATION_ENUM que especificam as opções de autenticação de associação. O padrão é zero. |
O exemplo de código a seguir mostra como as propriedades são definidas antes de criar o 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
O segundo objeto ADO é o objeto Command . O ProgID do objeto Command é "ADODB. Comando". Esse objeto permite que você emita instruções de consulta e outros comandos para ADSI usando a conexão ativa. O objeto Command usa sua propriedade ActiveConnection para manter uma conexão ativa. Ele também mantém a propriedade CommandText para manter instruções de consulta emitidas por um usuário. As instruções de consulta são expressas no dialeto SQL ou no dialeto LDAP.
Os exemplos de código a seguir mostram como criar um objeto Command .
Set command = CreateObject("ADODB.Command")
Set command.ActiveConnection = oConnect
command.CommandText =
"SELECT AdsPath, cn FROM 'LDAP://DC=Fabrikam,DC=com' WHERE objectClass = '*'"
No exemplo de código a seguir, inclua a biblioteca de tipos ADO (msadoXX.dll) como uma das referências.
Dim command As New Command
Set command.ActiveConnection = oConnect
command.CommandText = "<LDAP://DC=Fabrikam,DC=com>;(objectClass=*);AdsPath, cn; subTree"
As opções de pesquisa para o objeto Command são especificadas definindo a propriedade Properties . A tabela a seguir lista as propriedades nomeadas aceitáveis para Propriedades.
Propriedade nomeada | Descrição |
---|---|
"Assíncrono" | Um valor booleano que especifica se a pesquisa é síncrona ou assíncrona. O padrão é False (síncrono). Uma pesquisa síncrona bloqueia até que o servidor retorne o resultado inteiro ou, para uma pesquisa paginada, a página inteira. Uma pesquisa assíncrona bloqueia até que uma linha dos resultados da pesquisa esteja disponível ou até que o tempo especificado pela propriedade "Timeout" decorra. |
"Resultados do cache" | Um valor booleano que especifica se o resultado deve ser armazenado em cache no lado do cliente. O padrão é true; O ADSI armazena em cache o conjunto de resultados. Desativar essa opção pode ser desejável para grandes conjuntos de resultados. |
"Perseguir referências" | Um valor do ADS_CHASE_REFERRALS_ENUM que especifica como a pesquisa persegue referências. O padrão é ADS_CHASE_REFERRALS_NEVER. Para obter mais informações sobre essa propriedade, consulte Referências. |
"Somente nomes de coluna" | Um valor booleano que indica que a pesquisa deve recuperar apenas o nome dos atributos aos quais os valores foram atribuídos. O padrão é false. |
"Apelidos de deref" | Um valor booleano que especifica se os aliases de objetos encontrados são resolvidos. O padrão é false. |
"Tamanho da página" | Um valor inteiro que ativa a paginação e especifica o número máximo de objetos a serem retornados em um conjunto de resultados. O padrão é nenhum tamanho de página. Para obter mais informações, consulte Recuperando grandes conjuntos de resultados. |
"SearchScope" | Um valor da enumeração ADS_SCOPEENUM que especifica o escopo de pesquisa. O padrão é ADS_SCOPE_SUBTREE. |
"Limite de tamanho" | Um valor inteiro que especifica o limite de tamanho para a pesquisa. Para o Active Directory, o limite de tamanho especifica o número máximo de objetos retornados. O servidor pára de pesquisar quando o limite de tamanho é atingido e retorna os resultados acumulados. O padrão é sem limite. |
"Classificar" | Uma cadeia de caracteres que especifica uma lista separada por vírgulas de atributos a serem usados como chaves de classificação. Essa propriedade funciona apenas para servidores de diretório que oferecem suporte ao controle LDAP para classificação do lado do servidor. O Active Directory oferece suporte ao controle de classificação, mas pode afetar o desempenho do servidor, especialmente se o conjunto de resultados for grande. Lembre-se de que o Active Directory oferece suporte a apenas uma única chave de classificação. O padrão é nenhuma classificação. |
"Limite de tempo" | Um valor inteiro que especifica o limite de tempo, em segundos, para a pesquisa. Quando o limite de tempo é atingido, o servidor pára de pesquisar e retorna os resultados acumulados. O padrão é sem limite de tempo. |
"Tempo limite" | Um valor inteiro que especifica o valor de tempo limite do lado do cliente, em segundos. Esse valor indica o tempo que o cliente aguarda os resultados do servidor antes de interromper a pesquisa. O padrão é sem tempo limite. |
O exemplo de código a seguir mostra como definir opções de pesquisa.
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.
O terceiro objeto ADO é RecordSet. Você obtém esse objeto quando você invoca o método Execute em um objeto Command . A função principal do objeto RecordSet é enumerar o conjunto de resultados e obter os dados. O conjunto de resultados pode conter valores para atributos que têm valores únicos ou múltiplos. Obter um atributo de valor único é simples, semelhante a obter o valor da coluna no banco de dados relacional, por exemplo:
Fields('name').Value
Obter um atributo com vários valores, no entanto, é mais desafiador. Nesse caso, o Field.Value é uma matriz e você deve verificar o limite inferior e superior da matriz, conforme mostrado no exemplo de código a seguir.
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
O exemplo de código a seguir desabilita as contas de usuário em um 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 obter mais informações sobre o modelo de objeto ADO, consulte Microsoft ActiveX Data Objects.