【问题标题】:DirectoryEntry() works in .NET 4.0 but in .NET 3.5 doesn't?DirectoryEntry() 在 .NET 4.0 中有效,但在 .NET 3.5 中无效?
【发布时间】:2012-09-05 03:51:56
【问题描述】:

我有一个需要为 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 版本中的工作方式不同,并且很乐意将至少可以帮助我更好地理解这些内容的答案标记为正确。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    显然绑定到目录时出现问题。

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

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

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

    【讨论】:

    • 谢谢,很棒的信息。我意识到像这样的问题有很多变量,无法给出明确的答案(什么是 IIS 设置,什么是 AD 设置,Web.config 文件中有什么?)。但你所说的肯定有帮助。
    猜你喜欢
    • 2014-07-10
    • 2011-04-04
    • 2012-03-14
    • 2010-10-11
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多