DirectoryEntry()在.NET 4.0中有效,但在.NET 3.5中却没有?

时间:2012-09-12 07:11:43

标签: c# .net-4.0 exception-handling .net-3.5 directoryservices

我有一个内部网,需要为AD系统中的用户运行查询。我正在尝试使用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)
{
}

奇怪的是,当我引用.NET4.0版本的System.DirectoryServices DLL时,这适用于我的开发机器,但不适用于.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版本的工作方式不同,并且很乐意将正确的答案标记为正确,这至少可以帮助我更好地理解这些内容。

1 个答案:

答案 0 :(得分:4)

  

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

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

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

显然,绑定目录存在问题。

我发现很难相信.NET Framework版本会有所作为;我会将你的代码剥离为一个简单的样本,你使用相同的代码和相同的.NET 3.5和.NET 4版本的环境。

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

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