Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用C和ADODB查询Active Directory?_C#_Active Directory_Adodb - Fatal编程技术网

C# 如何使用C和ADODB查询Active Directory?

C# 如何使用C和ADODB查询Active Directory?,c#,active-directory,adodb,C#,Active Directory,Adodb,正在查找使用C通过ADODB连接到Active Directory的示例 我的目标是能够基于某个用户的属性(用户id、电子邮件地址等),运行查找以验证该用户在Active Directory中是否有效 [要强调的是,使用ADODB是这方面的一项要求,使用DirectoryServices不是有效的响应。] 我当前的方法在cmd.Execute位不工作异常: object parms = null; object recs = null; ADODB.Connection conn = new A

正在查找使用C通过ADODB连接到Active Directory的示例

我的目标是能够基于某个用户的属性(用户id、电子邮件地址等),运行查找以验证该用户在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);
我不确定是否/在哪里提供服务器引用,也不确定通过ref传递到cmd.Execute方法的参数应该是什么。没有太多通过ADODB从C连接到ActiveDirectory的文档

康涅狄格州返回1,所以我相信我得到了一个积极的联系。我认为问题在于传递给cmd.Execute方法的参数。

这是可行的

希望这能帮助其他有同样需求和问题的人

[请注意,缺少ADODB.Command对象,并且查询使用SQL格式而不是ADSI格式。]

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());
}

查看Richard Mueller在Active Directory上的网站-他专门有一个关于广告ADO搜索技巧的页面:

他的网站上也有很多优秀的参考资料,比如Excel表格,上面有所有的广告属性及其特点

强烈推荐


马克

斯科特彻的答案有效,但也有局限性,特别是你无法处理1000条记录的结果限制。要做到这一点,唯一的方法是使用命令对象,相信我,这是一个雷区,因为在C接口上没有很好的文档,而且在撰写本文时,还没有完全的解决方案可以通过谷歌搜索

我花了最后几天的时间在这个问题上,我有一些工作要做,我想把我读过的所有资料和拼图的各个部分都还给大家

首先,正如在很多地方所指出的,只有VB示例!,如果您不做一些特殊的事情,那么所有的ADSI查询都被限制为1000行结果。避免这种情况的关键是在命令对象上设置页面大小属性。我们将在一秒钟内完成这项工作,但首先我们需要使用命令使基本查询正常工作。如果您在此线程中使用原始代码,则会在cmd.Execute上出现异常,抱怨参数不匹配。您可能认为传入null作为ref对象就足够了,特别是因为LDAP语法显然没有参数

我在两个地方找到了答案。首先,即使没有显式指定参数,LDAP SQL语法中的:似乎足以让ADO认为需要参数。奇怪,但似乎是真的。其次,指定无参数情况的正确方法是将值设置为Type.Missing,而不是null,如中所示:

对象参数=类型。缺少;

这是让Execute不抛出异常的关键

现在,通过一个有效的命令,我们可以解决1000行的限制。这只是通过在命令上指定Page Size属性来实现的,但是,从C接口可以明显看出,它与C属性不同。您需要将其放入Properties集合中,但这并没有公开一个很好的集合接口。经过反复试验,正确的语法是:

cmd.Properties[页面大小].Value=500;


我认为页面大小到底是多少并不重要,但设置为某个值就足以让ADSI获得所有结果。我真诚地希望这对某人有所帮助。

感谢您提供的信息,这是一个很好的信息。但是,它不包括C示例以及我遇到问题的C方法所需的参数。这只是在三年后帮助我完成了加载: