我正在开发一个使用C#和C ++通过LDAP提供程序与Active Directory通信的应用程序。该应用程序在Windows 2003,2008和2008 R2上运行。我正在使用看起来像这样的绑定字符串:
LDAP://mydomain.com/CN=Fred,DC=mydomain,DC=com
LDAP://server.mydomain.com/CN=Fred,DC=mydomain,DC=com
。
应用程序负责目录中的读写操作。例如,在一个场景中,它会创建一个新OU,然后在该新OU中创建多个用户和组。在另一种情况下,它向交互式用户呈现目录视图,并允许用户创建新的组或用户帐户。
到目前为止,我一直在使用基于域的绑定(上面的第一个示例绑定字符串),基于MSDN的建议:
在大多数情况下,绑定不应该不必要地绑定到单个服务器。 Active Directory域服务支持无服务器绑定,这意味着可以在默认域上绑定Active Directory,而无需指定域控制器的名称
当域上有多个域控制器时,会出现问题;我现在称他们为Lefty和Righty。如果我使用LDAP://mydomain.com/blah
绑定到目录,我隐式连接到Lefty或Righty。以下是发生情况的示例场景:
在第3步中,并不严格要求重新绑定,但在某些情况下,涉及两个不同的可执行文件,因此我无法共享IADs
或DirectoryEntry
。在内部,我认为Active Directory的内核正在使用DsGetDcName来选择要与之通信的服务器,并且其中的文档讨论了如何选择域控制器以及如何缓存该信息。不幸的是,据我所知,这不是应用程序可以真正控制的东西。在某些情况下,我看到应用程序始终连接到一个域控制器或另一个域控制器,但在其他情况下,应用程序似乎在域控制器之间来回切换(如上所述),并且事情不起作用。
解决实际问题:这只是基于域的绑定的基本限制吗?我认为如果我直接绑定到特定的域控制器,问题就会消失,但这会使应用程序代码变得非常复杂,所以我希望避免它。
答案 0 :(得分:1)
这是ldap服务器复制的固有问题。我从未使用过c#api。 我曾在linux上使用eDirectory。在创建对象后,如果要引用它,最好的选择是坚持使用服务器/ DC。
为什么它会使应用程序复杂化?写一个功能来拿起一台服务器。功能 应该对域进行dns查找(example.com)如果你有多个域控制器,它将返回所有的ip地址,拿起一个正在运行的地址(ping,ldap root dse search)并将其返回给调用者。 / p>
只有在遇到上述问题时才尝试使用此功能。在其他地方只需坚持使用域名。
答案 1 :(得分:0)
首先:我会说@Kalyan:你写了一个方法,首先在你的工作开始时选择一个域名控制器并将其存储在一个共享的地方,然后所有的EXE都使用它。
第二:您可能可以使用DirectoryServer
类System.DirctoryService.ActiveDirectory
中的schemaUpdateNow
类中的SyncReplicaFrom ...方法强制首次使用您创建OU的域控制器进行复制,或者使用Interop DsReplicaSyncAll函数。我不确定第二种方式是好方法
备注:在纯LDAP的观点上,它可能在RootDSE或其他地方存在一个强制复制为“{{1}}”强制SCHEMA重新加载的属性。