2

我有一个需要为 AD 系统中的用户运行查询的 Intranet。我正在尝试使用 DirectoryEntry() 对象进行连接,然后设置 DirectorySearcher() 并搜索用户。归结为最基本的,我的代码是这样的:

DirectoryEntry directoryObject = new DirectoryEntry("LDAP://RD-HQ/CN=Users,DC=rd-hq,DC=local");
DirectorySearcher ds = new DirectorySearcher(directoryObject);
ds.Filter = ("(&(objectClass=user))");
var test = ds.FindAll();
foreach (SearchResult item in test)
{
}

奇怪的是,当我引用 System.DirectoryServices DLL 的 .NET4.0 版本时,这在我的开发机器上有效,但在 .NET3.5 中无效(其中 System.DirectoryServices DLL 的版本是 v2.0.0.0)。

我得到的具体错误是关于ds.FindAll()方法的,内容如下:

异常详细信息:System.DirectoryServices.DirectoryServicesCOMException:发生操作错误。

单步执行代码表明该directoryObject对象实际上没有在第一行正确初始化。构造函数没有失败,但所有属性都抛出异常。

有什么想法我可能做错了吗?谢谢,我意识到这是一个有点蹩脚的、模糊的问题。


解决了

好的,我设法通过使用接受用户名和密码的 DirectoryEntry() 构造函数的重载来解决这个问题:

DirectoryEntry directoryObject = new DirectoryEntry("LDAP://RD-HQ/CN=Users,DC=rd-hq,DC=local", "rd-hq.local\mick", "notmypassword");

我仍然不确定为什么这在 .NET3.5 版本与 .NET4.0 版本中的工作方式不同,并且很乐意将答案标记为正确,这至少可以帮助我更好地理解这些东西。

4

1 回答 1

4

构造函数没有失败,但所有属性都抛出异常。

DirectoryEntry您访问相关属性之一时,实例将尝试绑定到目录 - 如果失败,属性访问器将引发异常。如果您尝试从调试器查看属性,也会发生这种情况。

在上面的代码中,绑定发生在ds.FindAll()被调用时。

显然存在绑定到目录的问题。

我很难相信 .NET Framework 版本会有所作为。我会将您的代码剥离为一个基本示例,您使用相同的代码和相同的环境用于 .NET 3.5 和 .NET 4 版本。

错误消息“发生操作错误”相当普遍,但如果您没有访问目录的权限,则可能会发生。因此,一种可能性是您的 .NET 3.5 和 .NET 4 版本在不同的身份下运行。至少这似乎是导致此类似问题的原因。

DirectoryCOMException 返回的 ErrorCode 也可能提供线索。

于 2012-09-12T07:53:55.193 回答