我正在开发一个应用程序,该应用程序使用 C# 和 C++ 通过 LDAP 提供程序与 Active Directory 对话。该应用程序在 Windows 2003、2008 和 2008 R2 上运行。我正在使用如下所示的绑定(bind)字符串:
LDAP://mydomain.com/CN=Fred,DC=mydomain,DC=com
LDAP://server.mydomain.com/CN=Fred,DC=mydomain,DC=com
。
应用程序负责目录中的读写操作。例如,在一种情况下,它会创建一个新的 OU,然后在该新的 OU 中创建多个用户和组。在另一种情况下,它向交互式用户呈现目录 View ,并允许用户创建新的组或用户帐户。
到目前为止,我一直在根据 MSDN 的建议使用基于域的绑定(bind)(上面的第一个示例绑定(bind)字符串) :
Under most circumstances, binding should not be unnecessarily tied to a single server. Active Directory Domain Services support serverless binding, which means that Active Directory can be bound to on the default domain without specifying the name of a domain controller
当域上有多个域 Controller 时,问题就来了;我暂时称他们为左撇子和右撇子。如果我使用 LDAP://mydomain.com/blah
绑定(bind)到该目录,我将隐式连接到 Lefty 或 Righty。这是发生的情况的示例场景:
- 绑定(bind)到 mydomain.com 的根。 Active Directory 胆量选择 Lefty 作为与之交谈的服务器。
- 创建一个名为 Container 的新 OU。 OU 是在 Lefty 上创建的。
- 尝试绑定(bind)到新的 OU。 Active Directory 胆量选择 Righty 作为与之通信的服务器,因此绑定(bind)失败,因为 Righty 不知道新的 OU。
- 等待 10-15 秒,然后再次尝试绑定(bind)。与任一服务器通话时绑定(bind)成功。
在第 3 步中,重新绑定(bind)不是严格要求的,但在某些情况下涉及两个不同的可执行文件,因此我无法共享 IADs
或 DirectoryEntry
。在内部我认为 Active Directory 胆量正在使用 DsGetDcName选择要与之通信的服务器,其文档讨论了如何选择域 Controller 以及如何缓存该信息。不幸的是,据我所知,这不是应用程序可以真正控制的东西。在某些情况下,我看到应用程序始终连接到一个域 Controller 或另一个域 Controller ,但在其他情况下,应用程序似乎在域 Controller 之间来回切换(如上所述),并且无法正常工作。
回到实际问题:这只是基于域的绑定(bind)的基本限制吗?我认为如果我直接绑定(bind)到特定的域 Controller ,问题就会消失,但这会使应用程序代码显着复杂化,所以我希望避免这种情况。
最佳答案
这是 ldap 服务器复制的固有问题。我从未使用过 c# api。 我在 linux 上研究过 eDirectory。如果您要引用对象,则在创建对象后立即使用服务器/DC 是最好的选择。
为什么会使申请复杂化?编写一个函数来获取服务器。功能 如果你有多个域 Controller ,应该为域(example.com)做一个 dns 查找,它将返回所有的 ip 地址,选择一个正在运行的(ping,ldap root dse 搜索)并将其返回给调用者。
仅当您遇到上述问题时才尝试使用该功能。在其他地方,只需坚持使用域即可。
关于c# - 我应该使用域名还是域 Controller 名称绑定(bind)到 Active Directory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6832457/