2009-07-16 2 views
2

C#을 사용하여 ADODB를 통해 Active Directory에 연결하는 예를 찾고 있습니다.C# 및 ADODB를 사용하여 Active Directory를 쿼리하는 방법은 무엇입니까?

내 목표는 사용자가 해당 사용자 속성 (사용자 ID, 이메일 주소 등)을 기반으로 Active Directory에서 유효한지 확인하기 위해 조회를 실행할 수있게하는 것입니다.

[DirectoryServices를 사용하여 유효한 응답하지 않습니다, ADODB를 사용하여 이것에 대한 요구 사항입니다 것을 강조하고 싶습니다.]

내 현재의 접근 방식은 (cmd.Execute 비트에서 예외) 작동하지 않습니다 :

object parms = null; 
object recs = null; 
ADODB.Connection conn = new ADODB.Connection(); 
ADODB.Command cmd = new ADODB.Command(); 
ADODB.Recordset rs = new ADODB.Recordset(); 

conn.Open("Provider=ADsDSOObject",obfsUser,obfsPass,0); 

cmd.ActiveConnection = conn; 
cmd.CommandText = "<LDAP://OU=obfsOU,DC=obfsDC,DC=corp,DC=Net>;;name;subtree"; 
rs = cmd.Execute(out recs, ref parms, 0); 

나는 서버 참조를 제공해야하는데, 매개 변수가 전달 된 매개 변수가 ref에 의해 cmd.Execute 메서드에 전달되었는지는 잘 모르겠다. ADODB를 통해 C#에서 ActiveDirectory에 연결하기위한 많은 설명서가 없습니다.

conn.State가 1을 반환하므로 연결이 활성화되었다고 생각합니다. 문제는 cmd.Execute() 메서드에 전달 된 매개 변수에 있다고 생각합니다.

답변

2

이것은 작동합니다.

희망은 내가 갖고있는 필요와 문제가 다른 사람에게 도움이되기를 바랍니다.

은 [의 ADODB.Command 개체의 부족 대신 ADSI 형식의 쿼리에 대한 SQL 형식의 사용을합니다.]

object recs; 

ADODB.Connection conn = new ADODB.Connection(); 
ADODB.Recordset rs = new ADODB.Recordset(); 

// You may need to provide user id and password instead of empty strings   
conn.Open("Provider=ADsDSOObject", "", "", 0); 

// replace <> elements with your server name and OU/DC tree org 
string server = "<enter your server name here>"; 
string start = "OU=<blah>,DC=<blah>,DC=<blah>,DC=<blah>"; 
string where = "objectClass = '*'"; 
string qry = string.Format("SELECT cn FROM 'LDAP://{0}/{1}' WHERE {2}", server, start, where); 

rs = conn.Execute(qry, out recs, 0); 

for (; !rs.EOF; rs.MoveNext()) 
{ 
    Console.WriteLine(rs.Fields["cn"].Value.ToString()); 
} 
+0

이것은 3 년 후 나에게 도움이되었다. :) – Ebikeneser

+0

큰 도움이 되었어요. – ScottCher

0

체크 아웃 액티브 디렉토리에 리처드 뮬러의 웹 사이트를 - 그는 특히있다 AD에 대한 ADO 검색 팁 페이지 :

모든 AD의 속성과 특성을 가진 엑셀 시트처럼 자신의 웹 사이트에 훌륭한 참고 자료의 회전은,도있다

http://www.rlmueller.net/ADOSearchTips.htm

.

강력 추천!

마크

+0

정보 주셔서 감사합니다. 좋은 정보입니다. 그러나 C# 예제 및 C# 메서드에 필요한 매개 변수가 포함되어 있지 않아 문제가있었습니다. – ScottCher

4

ScottCher에 의한 대답은 작동하지만 당신이 1000 기록 결과의 한계를 처리 할 수없는 특히 있다는 한계가있다. 이를 수행하려면 전용 방법은 Command 객체를 사용하는 것이며 C# 인터페이스에 대한 좋은 설명서가 없기 때문에 지뢰밭이라고 생각합니다. (b) 믿을 수 없을만큼 완전한 해결책이 없습니다. 이 글을 쓴 것처럼 인터넷 검색을하십시오.

나는 이것에 대해 마지막 날을 보냈으며, 내가 퍼즐에 다양한 비트와 조각으로 읽은 모든 자료를 돌려주고 싶습니다.

처음에는 많은 장소에서 언급되었지만 (슬픈 예로 VB 예제에서만!), 특별한 것을하지 않으면 모든 ADSI 쿼리가 1000 행의 결과로 제한됩니다. 이를 피하기위한 핵심은 Command 개체에 "Page Size"속성을 설정하는 것입니다. 잠깐 후에 알아 보겠습니다.하지만 먼저 명령을 사용하여 기본 쿼리를 실행해야합니다. 이 스레드에서 원래 코드를 사용하면 매개 변수가 일치하지 않는다고 불평하는 cmd.Execute 예외가 발생합니다. LDAP 구문이 (분명히) 매개 변수를 갖고 있지 않기 때문에 ref 객체로 null을 전달하면 충분하다고 생각할 수 있습니다.

나는이 답변을 두 곳에서 발견했다.첫째, 매개 변수를 명시 적으로 지정하지 않아도 LDAP SQL 구문의 ":"은 ADO가 매개 변수가 필요하다고 생각하게하는 것입니다. 이상하지만 겉으로보기에는 사실입니다. 둘째, "매개 변수없이"사건을 지정하는 올바른 방법은 같이 Type.Missing, null이 아닌 값을 1로 설정하는 것입니다 :

object parms = Type.Missing;

예외가 발생하지 실행을 얻는 데 핵심이었다.

이제 작업중인 명령으로 1000 행 제한을 처리 할 수 ​​있습니다. 이는 Command에서 "Page Size"속성을 지정하여 "간단하게"수행되지만 C# 인터페이스에서 명백한 것처럼 C# 속성과 동일하지 않습니다. Properties 콜렉션에 넣어야하지만 좋은 콜렉션 인터페이스는이 콜렉션 인터페이스를 노출하지 않는다. 약간의 시행 착오 후, 올바른 구문은 다음과 같습니다

cmd.Properties["Page Size"].Value = 500;

나는 ADSI를 말할 충분가 (아직도 그와 함께 연주)하지만 무언가로 설정 페이지 크기가 정확히 무엇을 중요하다고 생각하지 않는다 모든 결과를 얻을 수 있습니다. 그리고 저는 이것이 누군가에게 도움이되기를 진심으로 바랍니다.

관련 문제