我有一个内部网,需要为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版本的工作方式不同,并且很乐意将正确的答案标记为正确,这至少可以帮助我更好地理解这些内容。
答案 0 :(得分:4)
构造函数不会失败,但所有属性都会抛出异常。
当您访问其中一个相关属性时,DirectoryEntry
实例将尝试绑定到该目录 - 如果此操作失败,则属性访问器将引发异常。如果您尝试从调试器中查看属性,也会发生这种情况。
在上面的代码中,绑定发生在调用ds.FindAll()
时。
显然,绑定目录存在问题。
我发现很难相信.NET Framework版本会有所作为;我会将你的代码剥离为一个简单的样本,你使用相同的代码和相同的.NET 3.5和.NET 4版本的环境。
错误消息“发生操作错误”相当普遍,但如果您没有访问该目录的权限,则可能会发生错误消息。因此,一种可能性是您的.NET 3.5和.NET 4版本在不同的身份下运行。至少这似乎是this similar problem的原因。
DirectoryCOMException返回的ErrorCode也可能提供线索。