我应该使用域名或域控制器名称绑定到Active Directory吗?



我正在开发一个通过LDAP提供程序与Active Directory对话的应用程序,使用c#和c++。该应用程序在Windows 2003、2008和2008 R2上运行。我使用的绑定字符串看起来像这样:

LDAP://mydomain.com/CN=Fred,DC=mydomain,DC=comLDAP://server.mydomain.com/CN=Fred,DC=mydomain,DC=com .

应用程序负责目录中的读和写操作。例如,在一个场景中,它创建一个新OU,然后在该新OU中创建几个用户和组。在另一个场景中,它向交互式用户展示目录视图,并允许用户创建新的组或用户帐户。

到目前为止,我一直在使用基于域的绑定(上面的第一个示例绑定字符串),基于MSDN的建议:

在大多数情况下,绑定不应该不必要地绑定到单个服务器。Active Directory域服务支持无服务器绑定,这意味着Active Directory可以绑定到默认域,而无需指定域控制器的名称

当域中有多个域控制器时,问题就出现了;我暂且叫他们阿左和阿右。如果我使用LDAP://mydomain.com/blah绑定到目录,我隐式地连接到左或右。下面是一个示例场景:

  1. 绑定到mydomain.com的根目录。Active Directory将选择Lefty作为与之通信的服务器。
  2. 创建名为Container的新OU。
  3. 在Lefty上创建OU。
  4. 尝试绑定新的OU。Active Directory将选择right作为要通信的服务器,因此绑定失败,因为right不知道新的OU。
  5. 等待10-15秒,重试绑定。当与任意一个服务器通信时,绑定成功。

在步骤3中,重新绑定并不是严格要求的,但是在某些场景中涉及到两个不同的可执行文件,因此我不能共享IADsDirectoryEntry。在内部,我认为Active Directory内部正在使用DsGetDcName来选择要与哪个服务器通信,并且关于如何选择域控制器以及如何缓存该信息的文档有一些讨论。不幸的是,据我所知,这不是应用程序可以真正控制的东西。在某些情况下,我看到应用程序始终连接到一个域控制器或另一个,但在其他情况下,应用程序似乎在域控制器之间来回切换(如上所述),事情不工作。

回到实际的问题:这只是基于域的绑定的一个基本限制吗?我认为如果我直接绑定到一个特定的域控制器,这个问题就会消失,但这会使应用程序代码变得非常复杂,所以我希望避免它。

这是ldap服务器复制的固有问题。我从未使用过c# api。我在linux上做过eDirectory。在创建对象之后,如果你打算引用它,最好的选择是坚持使用服务器/DC。

为什么会使应用程序复杂化?编写一个函数来获取服务器。这个函数如果您有多个域控制器,则应该对域(example.com)进行DNS查找,它将返回所有IP地址,选择正在运行的IP地址(ping, ldap根dse搜索)并将其返回给调用者。

当您遇到上述问题时,请尝试使用该函数。

第一:我会说@Kalyan:你写了一个方法,首先在你的工作开始时选择一个域控制器,并将其存储在一个共享的地方,然后所有的EXE使用它。

Second:您可能可以从您第一次使用SyncReplicaFrom创建OU的域控制器强制复制…方法在System.DirctoryService.ActiveDirectoryDirectoryServer类上或使用与DsReplicaSyncAll函数的互操作。我不确定第二种方法是不是好方法

注意:从纯LDAP的角度来看,可能在RootDSE或其他地方存在强制复制的属性,如' schemaUpdateNow '强制SCHEMA重新加载。

最新更新