gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:37:10 25 4
gpt4 key购买 nike

寻找使用 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 的文档并不多。

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

最佳答案

ScottCher 的答案有效,但它有局限性,特别是您无法处理 1000 条记录结果限制。要做到这一点,唯一的方法是使用 Command 对象,相信我,这是一个雷区,因为 (a) 没有关于 C# 接口(interface)的良好文档,并且 (b) 令人难以置信截至撰写本文时,还没有可以在 Google 上搜索到的完整解决方案。

我花了最后几天的时间来解决这个问题,并取得了一些成果,我想将这些成果回馈给我阅读过的所有资源,其中包括解决难题的各种点滴。

首先,正如很多地方所指出的(遗憾的是,只有 VB 示例!),如果您不做一些特殊的事情,那么所有 ADSI 查询都将限制为 1000 行结果。避免这种情况的关键是在 Command 对象上设置“Page Size”属性。我们稍后会介绍这一点,但首先我们需要使用命令来进行基本查询。如果您在此线程中使用原始代码,您将在 cmd.Execute 上收到异常,提示参数不匹配。您可能认为传入 null 作为 ref 对象就足够了,特别是因为 LDAP 语法(显然)没有参数。

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


对象参数 = Type.Missing;

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

现在,通过有效的命令,我们现在可以解决 1000 行的限制。这“简单”地通过在命令上指定“页面大小”属性来实现,但从 C# 界面中可以明显看出,它与 C# 属性不同。您需要将其放入 Properties 集合中,但这不会公开一个很好的集合接口(interface)来执行此操作。经过一番尝试和错误,正确的语法是:


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

我认为页面大小到底是什么并不重要(仍在考虑),但将其设置为足以告诉 ADSI 获取所有结果。我真诚地希望这对某人有帮助。

关于c# - 如何使用 C# 和 ADODB 查询 Active Directory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1140331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com