ActiveXデータオブジェクト (ADO) を使用した検索

ActiveXデータオブジェクト (ADO) モデルは、次の表に示すオブジェクトで構成されています。

オブジェクト 説明
接続 ADSIなどのOLE DBデータソースへの開いている接続。
コマンド データソースに対して実行する特定のコマンドを定義します。
パラメーター コマンドオブジェクトに提供する任意のパラメーターのオプションのコレクション。
RecordSet テーブル、コマンドオブジェクト、またはSQL構文のレコードのセット。 レコードセットは、基になる接続オブジェクトなしで作成できます。
フィールド レコードセット内の単一のデータ列。
プロパティ ADOのプロバイダーによって提供される値のコレクション。
エラー データアクセスエラーに関するデータが含まれます。 1回の操作でエラーが発生したときに更新されます。

ADOがADSIと通信するには、少なくとも2つのADOオブジェクトが必要です。ConnectionRecordSetです。 これらのADOオブジェクトは、それぞれユーザーの認証と結果の列挙に使用されます。 通常は、Command オブジェクトを使用して、アクティブな接続を維持し、ページサイズや検索範囲などのクエリパラメーターを指定し、クエリを実行します。 検索フィルター構文の詳細については、検索フィルター構文を参照してください。

Connectionオブジェクトは、OLE DBプロバイダーを読み込み、ユーザーの資格情報を検証します。 Visual Basicで、"ADODB.Connection"を指定してCreateObject 関数を呼び出し、Connectionオブジェクトのインスタンスを作成してから、ConnectionオブジェクトのProviderプロパティを"ADsDSOObject"に設定します。"。 ADODB.Connection"はConnection オブジェクトのProgIDで、"ADsDSOObject"はADSIのOLE DBプロバイダーの名前です。 資格情報が指定されていない場合は、現在ログオンしているユーザーの資格情報が使用されます。

次のコード例は、Connectionオブジェクトのインスタンスを作成する方法を示しています。

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

次のコード例は、Connectionオブジェクトのインスタンスを作成する方法を示しています。

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

次のコード例は、Connectionオブジェクトのインスタンスを作成する方法を示しています。 Visual Basicプロジェクトの参照の1つとしてADOタイプライブラリ (msadoXX.dll) を含める必要があることに注意してください。

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

Connectionオブジェクトのプロパティを設定して、ユーザー認証データを指定します。 次の表に、ADSIでサポートされているユーザー認証プロパティを示します。"。

プロパティ 説明
ユーザーID" 検索の実行時に使用されるセキュリティコンテキストを持つユーザーを識別する文字列。 ユーザー名文字列の形式の詳細については、 「IADsOpenDSObject::OpenDSObject」 を参照してください。 指定しない場合、既定値はログオンしているユーザー、または呼び出し元プロセスによって権限を借用したユーザーになります。"。
"Password" "ユーザーID"で識別されるユーザーのパスワードを指定する文字列。"。
パスワードの暗号化" パスワードを暗号化するかどうかを指定するブール値。 既定値は false です。
ADSIフラグ" バインド認証オプションを指定するADS_AUTHENTICATION_ENUM列挙体のフラグのセット。 既定値は 0 です。

次のコード例は、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

2番目のADOオブジェクトはCommandオブジェクトです。 CommandオブジェクトのProgIDは"ADODB.Command"です。 このオブジェクトを使用すると、アクティブな接続を使用してクエリステートメントやその他のコマンドをADSIに発行できます。 Commandオブジェクトは、ActiveConnectionプロパティを使用してアクティブな接続を維持します。 また、CommandTextプロパティを保持して、ユーザーが発行したクエリステートメントを保持します。 クエリ文はSQL方言またはLDAP方言で表現されます。

次のコード例は、Commandオブジェクトを作成する方法を示しています。

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

次のコード例では、ADOタイプライブラリ (msadoXX.dll) を参照の1つとして含めます。

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

Commandオブジェクトの検索オプションを指定するには、Propertiesプロパティを設定します。 次の表に、Propertiesで使用できる名前付きプロパティを示します。

名前付きプロパティ 説明
"非同期" 検索が同期か非同期かを指定するブール値です。 既定値はFalse (同期) 。 です。同期検索は、サーバーが結果全体を返すまで、またはページング検索の場合はページ全体を返すまでブロックします。 非同期検索は、検索結果の1行が使用可能になるまで、または"Timeout"プロパティで指定された時間が経過するまでブロックします。"。
結果をキャッシュする" 結果をクライアント側でキャッシュするかどうかを指定するブール値。 既定値はtrueです。ADSIは結果セットをキャッシュします。 結果セットが大きい場合は、このオプションをオフにすることをお勧めします。"。
参照の追跡" 検索で参照を追跡する方法を指定するADS_CHASE_REFERRALS_ENUMの値。 デフォルトはADS_CHASE_REFERRALS_NEVERです。このプロパティの詳細については、Referralsを参照してください。
列名のみ" 検索で値が割り当てられている属性の名前のみを取得する必要があることを示すブール値。 既定値は false です。
Derefエイリアス" 見つかったオブジェクトのエイリアスを解決するかどうかを指定するブール値。 既定値は false です。
ページサイズ" ページングを有効にし、結果セットで返すオブジェクトの最大数を指定する整数値。 既定では、ページサイズはありません。 詳細については、 大きな結果セットを取得するを参照してください。"。
SearchScope" 検索範囲を指定するADS_SCOPEENUM列挙体の値。 既定値はADS_SCOPE_SUBTREEです。"。
Size Limit" 検索のサイズ制限を指定する整数値。 Active Directoryの場合、サイズ制限によって返されるオブジェクトの最大数が指定されます。 サイズ制限に達すると、サーバーは検索を停止し、累積された結果を返します。 既定値は無制限です。"。
並べ替え基準" 並べ替えキーとして使用する属性のコンマ区切りリストを指定する文字列。 このプロパティは、サーバー側の並べ替えのLDAP制御をサポートするディレクトリサーバーに対してのみ機能します。 Active Directoryは並べ替え制御をサポートしていますが、特に結果セットが大きい場合は、サーバーのパフォーマンスに影響を与える可能性があります。 Active Directoryは1つの並べ替えキーのみをサポートしていることに注意してください。 既定では、並べ替えは行われません。"。
時間制限" 検索の制限時間を秒単位で指定する整数値。 制限時間に達すると、サーバーは検索を停止し、蓄積された結果を返します。 既定値は時間制限なしです。
"タイムアウト" クライアント側のタイムアウト値を秒単位で指定する整数値。 この値は、クライアントが検索を停止する前にサーバーからの結果を待機する時間を示します。 既定では、タイムアウトはありません。

次のコード例は、検索オプションを設定する方法を示しています。

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.

3番目のADOオブジェクトはRecordSetです。 このオブジェクトは、CommandオブジェクトでExecuteメソッドを呼び出すと取得されます。 RecordSetオブジェクトの主な機能は、結果セットを列挙してデータを取得することです。 結果セットには、1つまたは複数の値を持つ属性の値を含めることができます。 単一値の属性を取得するのは簡単で、リレーショナルデータベースの列値を取得するのと似ています。

Fields('name').Value

ただし、複数の値を持つ属性を取得するのはより困難です。 この例では、Field.Valueは配列であり、次のコード例に示すように、配列の下限と上限を確認する必要があります。

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

次のコード例では、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

ADOオブジェクトモデルの詳細については、 Microsoft ActiveXデータオブジェクトを参照してください。