2012-09-12 82 views
3

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

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对象实际上并未在第一行正确初始化。构造函数不会失败,但所有属性都抛出异常。

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


解决

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

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

我仍然不知道为什么这在.NET3.5版本和.NET4.0版本中的作用是不同的,并且会很高兴地标记为正确的答案,至少可以帮助我更好地理解这些东西。

回答

5

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

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

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

显然有一个绑定到目录的问题。

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

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

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

+0

谢谢,很好的信息。我意识到在这样的问题中存在很多变量,因此无法给出明确的答案(什么是IIS设置,什么是AD设置,Web.config文件中有什么?)。但肯定你说过的话有帮助。 –

相关问题