20.2 Other Ways of Connecting and Retrieving Results
As mentioned earlier, there are a number of ways of authenticating an
ADO connection to Active Directory. The simplest is the way outlined
earlier using the Connection::Provider set with
the username and password as second and third arguments:
Set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADSDSOObject"
objConn.Open "", _
"CN=Administrator,CN=Users,dc=mycorp,dc=com", _
"mypass"
Because ADO is designed for databases, it is often necessary to
specify a number of other requirements when opening a connection.
These include a different provider, a different server, or a specific
database. All of these items can be set prior to opening the
connection. However, none of these make a difference to the AD
provider. If you wish to open a connection by setting these values in
the ConnectionString property, then do so as shown
in the following code:
Set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADSDSOObject"objConn.ConnectionString = _
"DSN=;UID=CN=Administrator,CN=Users,dc=mycorp,dc=com;PWD=mypass"
objConn.Open
Semicolons separate the arguments, with the expected
DataSourceName (DSN) specified as empty at
the start of the string.
One important point: do not authenticate using both methods with the
same connection—use one or the other. The following code uses
both methods to illustrate what not to do:
Set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADSDSOObject"
objConn.Open _
"DSN=;UID=CN=Administrator,CN=Users,dc=mycorp,dc=com;PWD=mypass", _
"CN=Administrator,CN=Users,dc=mycorp,dc=com", "mypass"
This is a slightly different version, but still wrong:
Set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADSDSOObject"
objConn.ConnectionString = _
"DSN=;UID=CN=Administrator,CN=Users,dc=mycorp,dc=com;PWD=mypass"
objConn.Open "", "CN=Administrator,CN=Users,dc=mycorp,dc=com", _
"mypass"
20.2.1 Searching With SQL
You can retrieve resultsets in a variety of ways
and get exactly the same values. We will now discuss how to use the
Command object and the
Recordset::Open method, using SQL-formatted
queries to retrieve resultsets. SQL is a powerful query language that
is the de facto standard to query database tables. We do not propose
to go through the details of SQL here, but we will cover some
examples for those who may already be familiar with SQL and would
find using it to be a more comfortable way of querying Active
Directory than using LDAP search filters.
20.2.1.1 Using the Connection::Execute method
You can pass a SQL select statement to a connection using the
Execute method as we've done
previously with LDAP-based queries:
Set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADSDSOObject"
objConn.Open "", "CN=Administrator,CN=Users,dc=mycorp,dc=com", ""
Set objRS = objConn.Execute "Select Name, ADsPath" _
& " FROM 'LDAP://dc=mycorp,dc=com' where objectclass = 'user'"
20.2.1.2 Using the Recordset::Open method
Next we will set the Recordset::ActiveConnection
and Recordset::Source properties before the
Recordset::Open method is called; the second
passes values directly to the Recordset::Open
method.
Setting the properties first:
Set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADSDSOObject"
objConn.Open "", "CN=Administrator,CN=Users,dc=mycorp,dc=com", ""
'Open a recordset based on a SQL string by presetting the properties
Set objRS = CreateObject("ADODB.Recordset")
objRS.ActiveConnection = objConn
objRS.Source = "Select Name, ADsPath FROM " _
& "'LDAP://dc=mycorp,dc=com' where objectclass = 'user'"
objRS.Open
Passing values directly:
Set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADSDSOObject"
objConn.Open "", "CN=Administrator,CN=Users,dc=mycorp,dc=com", ""
'Open a recordset based on a SQL string
'Set the SQL search string
strSource = "Select Name, ADsPath FROM 'LDAP://dc=mycorp,dc=com' " _
& "where objectclass = 'user'"
'Pass what will become the Source and ActiveConnection properties to
'the Recordset::Open call
objRS.Open strSource, objConn
20.2.1.3 Executing a specific command
You can use the
Command object's methods and
properties to pass a complete command to an already open connection:
Set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADSDSOObject"
objConn.Open "", "CN=Administrator,CN=Users,dc=mycorp,dc=com", ""
'Opening a recordset based on a command object
Set objComm = CreateObject("ADODB.Command")Set objComm.ActiveConnection = objConn
objComm.CommandText = "Select Name, ADsPath FROM" _
& " 'LDAP://dc=mycorp,dc=com' where objectclass = 'user'"
Set objRS = objComm.Execute( )
Or you can do this:
Set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADSDSOObject"
objConn.Open "", "CN=Administrator,CN=Users,dc=mycorp,dc=com", ""
'Opening a recordset based on a Command object
Set objComm = CreateObject("ADODB.Command")
Set objComm.ActiveConnection = objConn
Set objRS = objComm.Execute "Select Name, ADsPath FROM" _
& " 'LDAP://dc=mycorp,dc=com' where objectclass = 'user'"
When conducting a search, the
Command object can take a number of extra
parameters. For example, a parameter can dictate how many results are
returned (Page Size), how long in seconds the
command can take before it fails (Timeout), how
far to search in the database (Searchscope), and
whether the resultset is cached in memory for faster access at a
later date (Cache Results). These four values are
shown in the following code section:
Const ADS_SCOPE_SUBTREE = 2
Set objComm = CreateObject("ADODB.Command")
objComm.Properties("Page Size") = 10000
objComm.Properties("Timeout") = 60
objComm.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objComm.Properties("Cache Results") = False
For more information, consult the ADO Command object in MSDN.
|
20.2.1.4 The Command object and Recordset::Open
You can even combine the Command object and
Recordset::Open, like this:
Set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADSDSOObject"
objConn.Open "", "CN=Administrator,CN=Users,dc=mycorp,dc=com", ""
Set objComm = CreateObject("ADODB.Command")
Set objComm.ActiveConnection = objConn
objComm.CommandText = ""Select Name, ADsPath FROM" _
& " 'LDAP://dc=mycorp,dc=com' where objectclass = 'user'"
'Pass what will become the Source and ActiveConnection properties to
'the Recordset::Open call
objRS.Open objComm, objConn
|