2009-07-16 73 views
2

寻找一个使用C#通过ADODB连接到Active Directory的示例。如何使用C#和ADODB查询Active Directory?

我的目标是能够根据用户属性(用户标识,电子邮件地址等)的运行状况,运行查找以验证用户在Active Directory中的有效性。

[想强调的是,利用ADODB是这样的要求,使用的DirectoryServices不是有效的响应。]

我目前的做法不工作(在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); 

我不知道如果/我应该提供服务器引用,我不确定什么参数传递到cmd.Execute方法由ref应该是。没有大量的文档通过ADODB从C#连接到ActiveDirectory。

conn.State正在返回1,所以我相信我正在获得活动连接。我认为问题出在传递给cmd.Execute()方法的参数中。

回答

2

This Works。

希望这可以帮助有其他人有我一样的需要和问题。

[注缺乏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

这只是帮助我出了三年后的负荷:) – Ebikeneser 2012-08-17 08:45:41

+0

太好了 - 很高兴它有所帮助。 – ScottCher 2012-10-25 16:37:38

0

退房Active Directory上的理查德·米勒的网站 - 他专门有一个ADO的搜索提示页面AD:

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

还有很好的参考材料,在他的网站上摆,像所有的广告属性和它们的特征的Excel工作表。

强烈推荐!

马克

4

通过ScottCher答案工作,但它有它的局限性,特别是你不能处理1000条记录结果极限。要做到这一点,只有的方式是使用一个Command对象,并相信我,这是一个雷区,因为(一)在C#接口没有好的文档,和(b)难以置信的是没有完整的解决方案,可以在撰写本文时请使用Google搜索。

我已经度过了最后一天的时间,并且有一些工作,我想回馈给我阅读过的各种各样的零碎碎片来源。首先,正如很多地方所指出的(不幸的是只用VB示例!),如果你不做特别的事情,那么所有的ADSI查询都限制在1000行结果中。避免这种情况的关键是在Command对象上设置“页面大小”属性。我们将在一秒内做到这一点,但首先我们需要使用Command来获取基本查询。如果在此线程中使用原始代码,则会在cmd.Execute中抱怨参数不匹配。你会认为传入null作为ref对象就足够了,特别是因为LDAP语法不(显然)有参数。

我在两处找到了答案。首先,即使您没有明确指定参数,但似乎LDAP SQL语法中的“:”足以使ADO认为需要参数。奇怪,但看似真实。其次,要指定“无参数”情况下,正确的方法是将值设置为Type.Missing,不为空,如:

object parms = Type.Missing;

这是敲门砖,执行不抛出异常。

现在有了一个工作命令,我们现在可以解决1000行的限制。这是通过在Command上指定“Page Size”属性来“简单”的,但是从C#接口明显可见,它与C#属性不同。你需要把它放到Properties集合中,但是这并不公开一个很好的集合接口。一些试验和错误之后,正确的语法是:

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

我不认为这是很重要的页面大小是什么(仍与播放),但其设置的东西就足以告诉ADSI得到所有的结果。我真诚希望这有助于某人。