다음을 통해 공유


ADO(ActiveX Data Objects)를 사용하여 검색

ADO(ActiveX Data Object) 모델은 다음 표에 나열된 개체로 구성됩니다.

개체 설명
연결 ADSI와 같은 OLE DB 데이터 원본에 대한 열린 연결입니다.
명령 데이터 원본에 대해 실행할 특정 명령을 정의합니다.
매개 변수 명령 개체에 제공할 매개 변수에 대한 선택적 컬렉션입니다.
레코드 집합 테이블, 명령 개체 또는 SQL 구문의 레코드 집합입니다. 기본 연결 개체 없이 레코드 집합을 만들 수 있습니다.
필드 레코드 집합의 단일 데이터 열입니다.
속성 ADO에 대한 공급자가 제공하는 값의 컬렉션입니다.
오류 데이터 액세스 오류에 대한 데이터를 포함합니다. 단일 작업에서 오류가 발생할 때 새로 고쳐집니다.

ADO가 ADSI와 통신하려면 적어도 두 개의 ADO 개체인 ConnectionRecordSet이 있어야 합니다. 이러한 ADO 개체는 각각 사용자를 인증하고 결과를 열거하는 역할을 합니다. 일반적으로 Command 개체를 사용하여 활성 연결을 유지하고, 페이지 크기 및 검색 scope 같은 쿼리 매개 변수를 지정하고, 쿼리를 수행합니다. 검색 필터 구문에 대한 자세한 내용은 검색 필터 구문을 참조하세요.

Connection 개체는 OLE DB 공급자를 로드하고 사용자 자격 증명의 유효성을 검사합니다. Visual Basic에서 "ADODB"를 사용하여 CreateObject 함수를 호출합니다. Connection"을 사용하여 Connection 개체의 instance 만든 다음 Connection 개체의 Provider 속성을 "ADsDSOObject"로 설정합니다. "ADODB. Connection"은 Connection 개체의 ProgID이고 "ADsDSOObject"는 ADSI에서 OLE DB 공급자의 이름입니다. 자격 증명을 지정하지 않으면 현재 로그온한 사용자의 자격 증명이 사용됩니다.

다음 코드 예제에서는 Connection 개체의 instance 만드는 방법을 보여줍니다.

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

다음 코드 예제에서는 Connection 개체의 instance 만드는 방법을 보여줍니다.

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

다음 코드 예제에서는 Connection 개체의 instance 만드는 방법을 보여줍니다. ADO 형식 라이브러리(msadoXX.dll)를 Visual Basic 프로젝트의 참조 중 하나로 포함해야 합니다.

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

Connection 개체의 속성을 설정하여 사용자 인증 데이터를 지정합니다. 다음 표에는 ADSI에서 지원하는 사용자 인증 속성이 나와 있습니다.

속성 Description
"사용자 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

두 번째 ADO 개체는 Command 개체입니다. Command 개체의 ProgID는 "ADODB입니다. 명령". 이 개체를 사용하면 활성 연결을 사용하여 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)를 참조 중 하나로 포함합니다.

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

Command 개체에 대한 검색 옵션은 속성 속성을 설정하여 지정됩니다. 다음 표에서는 속성에 허용되는 명명된 속성을 나열합니다.

명명된 속성 설명
"비동기" 검색이 동기인지 비동기인지를 지정하는 부울 값입니다. 기본값은 False(동기)입니다. 동기 검색은 서버가 전체 결과를 반환하거나 페이징된 검색의 경우 전체 페이지를 반환할 때까지 차단됩니다. 비동기 검색은 검색 결과의 한 행을 사용할 수 있거나 "시간 제한" 속성에 지정된 시간이 경과할 때까지 차단됩니다.
"캐시 결과" 결과를 클라이언트 쪽에서 캐시할지 여부를 지정하는 부울 값입니다. 기본값은 true입니다. ADSI는 결과 집합을 캐시합니다. 이 옵션을 해제하는 것이 큰 결과 집합에 적합할 수 있습니다.
"체이스 추천" 검색에서 조회를 추적하는 방법을 지정하는 ADS_CHASE_REFERRALS_ENUM 값입니다. 기본값은 ADS_CHASE_REFERRALS_NEVER. 이 속성에 대한 자세한 내용은 조회를 참조하세요.
"열 이름만" 검색에서 값이 할당된 특성의 이름만 검색해야 했음을 나타내는 부울 값입니다. 기본값은 false입니다.
"데어프 별칭" 찾은 개체의 별칭이 확인되는지 여부를 지정하는 부울 값입니다. 기본값은 false입니다.
"페이지 크기" 페이징을 켜고 결과 집합에서 반환할 최대 개체 수를 지정하는 정수 값입니다. 기본값은 페이지 크기가 아닙니다. 자세한 내용은 큰 결과 집합 검색을 참조하세요.
"SearchScope" 검색 scope 지정하는 ADS_SCOPEENUM 열거형의 값입니다. 기본값은 ADS_SCOPE_SUBTREE.
"크기 제한" 검색의 크기 제한을 지정하는 정수 값입니다. Active Directory의 경우 크기 제한은 반환된 개체의 최대 수를 지정합니다. 서버는 크기 제한에 도달하면 검색을 중지하고 누적된 결과를 반환합니다. 기본값은 제한이 없습니다.
"정렬 켜기" 정렬 키로 사용할 쉼표로 구분된 특성 목록을 지정하는 문자열입니다. 이 속성은 서버 쪽 정렬을 위해 LDAP 컨트롤을 지원하는 디렉터리 서버에서만 작동합니다. Active Directory는 정렬 컨트롤을 지원하지만, 특히 결과 집합이 큰 경우 서버 성능에 영향을 줄 수 있습니다. Active Directory는 단일 정렬 키만 지원합니다. 기본값은 정렬이 아닙니다.
"시간 제한" 검색에 대한 시간 제한(초)을 지정하는 정수 값입니다. 시간 제한에 도달하면 서버는 검색을 중지하고 누적된 결과를 반환합니다. 기본값은 시간 제한이 없습니다.
"시간 제한" 클라이언트 쪽 시간 제한 값(초)을 지정하는 정수 값입니다. 이 값은 클라이언트가 검색을 중지하기 전에 서버에서 결과를 기다리는 시간을 나타냅니다. 기본값은 제한 시간이 없습니다.

다음 코드 예제에서는 검색 옵션을 설정하는 방법을 보여줍니다.

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.

세 번째 ADO 개체는 RecordSet입니다. Command 개체에서 Execute 메서드를 호출할 때 이 개체를 가져옵니다. RecordSet 개체의 기본 함수는 결과 집합을 열거하고 데이터를 가져오는 것입니다. 결과 집합에는 단일 또는 여러 값이 모두 있는 특성에 대한 값이 포함될 수 있습니다. 단일 값 특성을 가져오는 것은 관계형 데이터베이스에서 열 값을 가져오는 것과 유사하게 간단합니다. 예를 들면 다음과 같습니다.

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 Data Objects를 참조하세요.