게시판 본문 Active Directory Service Interface - Read Only

re: ADSI를 SQL로 쿼리해오는 방법
작성자: 송원석
작성일시: 2007-10-05 21:12,  조회수: 3,706
안녕하세요? 송원석입니다. ^_^

말씀하신 것처럼 SQL 쿼리문을 통해서 AD 의 개체를 조회할 수가 있습니다. 그러나 한 가지 오해하시면 안되는 것이 SELECT 가 된다고 해서 마치 데이터베이스 다루듯 쿼리로 모든 일을 다 할 수 있다고 생각하시면 곤란하다는 점입니다. 결국에는 ADSI 등을 사용하셔야만 합니다. ^_^

저도 최근에는 ADSI 작업을 해 본 적이 드물어서 기억이 잘 나지는 않습니다만, 예전에 작성했던 코드를 샘플삼아 간단히 설명을 드려보겠습니다. 먼저 RDN 을 얻습니다. RDN 은 말 그대로 ADsPath 의 루트 부분이라고 생각하시면 됩니다. 이 코드는 거의 공식과도 같은 것으로 DC=host,DC=domain,DC=com 등의 형태를 갖고 있는 문자열이며, 이 RDN 정보는 SELECT 문에서 FROM 절에 사용되게 됩니다.
'**********************************************************
'* RDN
'**********************************************************

Set objADsRootDSE = GetObject("LDAP://rootDSE")
strDomainDN = objADsRootDSE.Get("defaultNamingContext")
Set objADsRootDSE = Nothing
그리고, 다음과 같이 연결 개체를 생성하는데, 이 때 제공자 속성으로 넘겨지는 제공자의 형태에 주의하십시오. 구글 등 검색 엔진에서 이 단어로 검색해보시면 아마 참고하실 만한 자료들이 많이 나올 것입니다.
Set objADsConnection = CreateObject("ADODB.Connection")
objADsConnection.Provider = "ADsDSOObject"
objADsConnection.Open "Active Directory Provider"
그 다음 순서는 당연히 레코드셋을 만들고 조회하는 것입니다. 다음 코드에서는 사용자들의 CN 와 ADsPath 등을 얻고 있습니다. sAMAccountName 속성으로 정렬을 하고 있는 점을 기억해 두십시오. 그리고 쿼리에서 사용되는 컬럼에 해당하는 이름들은 LDAP 속성명입니다.
Set objADsRecordset = CreateObject("ADODB.Recordset")
objADsRecordset.Open "SELECT CN, ADsPath, sAMAccountName FROM 'LDAP://" & _
     strDomainDN & "' WHERE objectClass = 'user' AND objectClass = 'Person' " & _
     "ORDER BY sAMAccountName", objADsConnection, 1, 1
이 코드에서는 그다지 많은 것들을 조회하고 있지 않습니다. 가장 중요한 부분은 ADsPath 를 조회하고 있다는 점입니다. 여기에서 ADsPath 를 조회하는 이유는 이 결과를 바탕으로 ADSI 개체를 만들기 위해서입니다. 즉 데이터베이스와 비교해서 설명해본다면 일단 PK 값에 해당하는 정보를 이 쿼리로 얻고, 실제 데이터는 다음과 같은 ADSI 코드를 통해서 얻는거죠.
Do Until objADsRecordset.EOF
    strBuffer = objADsRecordset("sAMAccountName").Value
    Call getUserInformation(objADsRecordset.Fields("ADsPath").Value, _
        objConnection, objRecordset)
    objADsRecordset.MoveNext
    i = i + 1
Loop
objADsRecordset.Close

이 코드에서 사용하고 있는 getUserInformation 프로시저의 내부 구현 중 일부는 다음과 같습니다.
Public Sub getUserInformation(strADsPath, byRef objConnection, byRef objRecordset)

    ... 중략 ...
    
    Set objUser = GetObject(strADsPath)
    With objUser
    If UCase(.Class) = "USER" AND .AccountDisabled <> True Then
    
        strName             = adjustmentString(.Get("Name"))
        strsAMAccountName   = adjustmentString(.sAMAccountName)
        strFullName         = adjustmentString(.FullName)
        strDescription      = adjustmentString(.Description)
        strDepartment       = adjustmentString(.Department)
        strEmailAddress     = adjustmentString(.EmailAddress)
        strOfficeLocations  = adjustmentString(.OfficeLocations)
        strTelephoneNumber  = adjustmentString(.TelephoneNumber)
        strADsPathSelf      = adjustmentString(.AdsPath)
        strGUID             = adjustmentString(.GUID)
        strLastLogin        = adjustmentString(.LastLogin)
        strParent           = adjustmentString(.Parent)

    ... 후략 ...

결과적으로 위에서 얻어낸 ADsPath 를 활용하여 보다 더 구체적인 사용자 정보들을 얻어오고 있는 것입니다. 그리고 주의하실 점은 SELECT 문으로 AD 개체를 조회하는 경우 성능상의 이유 때문에 기본적으로 1000 개의 결과만 리턴됩니다. 따라서 이 제약을 해결하려면 다소의 테크닉이 필요합니다. 저 같은 경우는 특정 정보를 기준으로 정렬을 한 다음 더 이상 데이터가 리턴되지 않을 때까지 이전 조회의 가장 마지막 값의 다음 값부터 다시 조회를 하는 방법으로 해결을 했던 기억이 납니다.

감사합니다.
IP 주소: 121.143.98.29
전체 1 건의 댓글이 존재합니다.

AD초보운전

자세한 답변 정말 감사드려요.. ^^ 이렇게 쉽게 정보를 얻어가도 되는 것인지 죄송하기도 하네요~ 감사합니다~ ^-^
2007-10-08 16:00
전체 421 건의 게시물, 17 페이지로 구성된 Active Directory Service Interface 게시판의 5 페이지입니다.
게시물
331

ADSI를 SQL로 쿼리해오는 방법

AD초보운전

2007-10-05 5,337

re: ADSI를 SQL로 쿼리해오는 방법 [1]

송원석

2007-10-05 3,706
329

AD에서 직접생성한계정 OR ASP로 짜여진 관리자페이지에서 생성한계정..

ADSI초보

2007-09-06 2,945
328

re: AD에서 직접생성한계정 OR ASP로 짜여진 관리자페이지에서 생성한계정..

송원석

2007-09-06 2,988
327

LDAP에서 사용하는 포트 [2]

ADSI초보

2007-09-05 3,188
326

다른 질문 또 드립니다. ADSI정보를 가져올때

ADSI초보

2007-09-05 3,027
325

re: 다른 질문 또 드립니다. ADSI정보를 가져올때

송원석

2007-09-05 3,033
324

ADSI인증하는 부분에서 질문드립니다.

ADSI초보

2007-09-05 3,044
323

re: ADSI인증하는 부분에서 질문드립니다.

송원석

2007-09-05 2,842
321

ADSI서버가 죽어있는지 살아있는지 알수있는?

ADSI초보

2007-09-04 3,012
320

re: ADSI서버가 죽어있는지 살아있는지 알수있는?

송원석

2007-09-05 2,928
319

re: ADSI서버가 죽어있는지 살아있는지 알수있는?

ADSI초보

2007-09-05 2,818
316

LADP에서 정보 가져올때 옵션 문의드립니다.

ADSI초보

2007-08-29 3,112
315

re: LADP에서 정보 가져올때 옵션 문의드립니다.

송원석

2007-08-29 3,098
314

오류코드질문

이경로

2007-07-25 3,106
313

re: 오류코드질문

송원석

2007-07-25 2,935
312

안녕하세요.. ADSI SDK2.5 파일좀 부탁드려요..ㅜㅜ [1]

녕이

2007-07-09 2,829
311

re: 안녕하세요.. ADSI SDK2.5 파일좀 부탁드려요..ㅜㅜ

허욱

2007-12-19 540
310

혹시 그룹 계정이 속한 그룹 정보도 가져올 수 있나요?

ADSI

2007-06-12 2,872
309

re: 혹시 그룹 계정이 속한 그룹 정보도 가져올 수 있나요?

송원석

2007-06-12 3,157
308

re: 혹시 그룹 계정이 속한 그룹 정보도 가져올 수 있나요? [2]

ADSI

2007-06-13 2,751
307

응용프로그램 보내기 사용 권한 ...

녕이

2007-06-12 3,037
306

re: 응용프로그램 보내기 사용 권한 ...

송원석

2007-06-12 2,834
305

com 내보내기

녕이

2007-06-05 2,954
304

re: com 내보내기 [2]

송원석

2007-06-05 3,026