게시판 본문 Active Directory Service Interface - Read Only
re: ADSI를 SQL로 쿼리해오는 방법 |
---|
작성자: 송원석
작성일시: 2007-10-05 21:12,
조회수: 3,943
|
안녕하세요? 송원석입니다. ^_^
말씀하신 것처럼 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 | 2007-10-05 | 5,867 | ||
2007-10-05 | 3,943 | |||
329 | 2007-09-06 | 3,180 | ||
328 | 2007-09-06 | 3,229 | ||
327 |
LDAP에서 사용하는 포트 [2] |
2007-09-05 | 3,419 | |
326 | 2007-09-05 | 3,262 | ||
325 | 2007-09-05 | 3,258 | ||
324 | 2007-09-05 | 3,268 | ||
323 | 2007-09-05 | 3,092 | ||
321 | 2007-09-04 | 3,249 | ||
320 | 2007-09-05 | 3,182 | ||
319 | 2007-09-05 | 3,061 | ||
316 | 2007-08-29 | 3,352 | ||
315 | 2007-08-29 | 3,333 | ||
314 | 2007-07-25 | 3,344 | ||
313 | 2007-07-25 | 3,173 | ||
312 | 2007-07-09 | 3,064 | ||
311 |
허욱 |
2007-12-19 | 540 | |
310 | 2007-06-12 | 3,148 | ||
309 | 2007-06-12 | 3,403 | ||
308 | 2007-06-13 | 2,989 | ||
307 | 2007-06-12 | 3,272 | ||
306 | 2007-06-12 | 3,096 | ||
305 | 2007-06-05 | 3,191 | ||
304 |
re: com 내보내기 [2] |
2007-06-05 | 3,278 |