c# - 我应该使用域名还是域 Controller 名称绑定(bind)到 Active Directory?

标签 c# windows active-directory ldap

我正在开发一个应用程序,该应用程序使用 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。这是发生的情况的示例场景:

  1. 绑定(bind)到 mydomain.com 的根。 Active Directory 胆量选择 Lefty 作为与之交谈的服务器。
  2. 创建一个名为 Container 的新 OU。 OU 是在 Lefty 上创建的。
  3. 尝试绑定(bind)到新的 OU。 Active Directory 胆量选择 Righty 作为与之通信的服务器,因此绑定(bind)失败,因为 Righty 不知道新的 OU。
  4. 等待 10-15 秒,然后再次尝试绑定(bind)。与任一服务器通话时绑定(bind)成功。

在第 3 步中,重新绑定(bind)不是严格要求的,但在某些情况下涉及两个不同的可执行文件,因此我无法共享 IADsDirectoryEntry 。在内部我认为 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/

相关文章:

c# - 当我返回某些内容时,并非所有代码路径都返回一个值

c# - XNA 中的触摸按钮(具有按下、释放、移动状态)

c++ - 使用 C++ 以编程方式将新盘符分配给现有驱动器

c# - 使用 PrincipalSearcher 查找参数为 "or"的用户

authentication - Apache Shiro - 使用 cn 以外的属性进行身份验证?

active-directory - Ldap 查询仅返回 1000 个用户...是的,我正在使用分页

c# - 我是否需要将数据库事务与 c# TableAdapters 一起使用?

c# - Microsoft.VisualBasic.DateAndTime 到 C#

r - 加载 gdata 包时如何修复 Perl 警告消息?

windows - VS Code 和 WSL 集成终端 - 我无法将 WSL 设置为我的默认终端