Я работаю над приложением, которое взаимодействует с Active Directory через поставщика LDAP, используя как C #, так и C ++. Приложение работает в Windows 2003, 2008 и 2008 R2. Я использую строки привязки, которые выглядят так:
LDAP://mydomain.com/CN=Fred,DC=mydomain,DC=com
LDAP://server.mydomain.com/CN=Fred,DC=mydomain,DC=com
.
Приложение отвечает за операции чтения и записи в каталоге. Например, в одном сценарии он создает новое подразделение, а затем создает несколько пользователей и групп в этом новом подразделении. В другом сценарии он представляет представление каталога для интерактивного пользователя и позволяет пользователю создать новую группу или учетную запись пользователя.
До сих пор я использовал привязку на основе домена (первый пример строки привязки сверху), основываясь на рекомендации MSDN :
В большинстве случаев привязка не должна быть излишне привязана к одному серверу. Доменные службы Active Directory поддерживают привязку к серверу, что означает, что Active Directory может быть привязана к домену по умолчанию без указания имени контроллера домена
Проблема возникает, когда в домене несколько контроллеров домена; Я сейчас их назову Левша и Праведник. Если я связываюсь с каталогом, используя LDAP://mydomain.com/blah
, я неявно подключаюсь либо к левши, либо к праву. Вот пример сценария того, что происходит:
- Привязка к корню mydomain.com. Кишки Active Directory выбирают Lefty в качестве сервера для общения.
- Создайте новую OU под названием Container. Подразделение создано на левшей.
- Попытка привязки к новому подразделению. В Active Directory кишки выбирают Righty в качестве сервера для связи, поэтому привязка завершается неудачно, потому что Righty не знает о новом OU.
- Подождите 10-15 секунд и повторите попытку привязки. Привязка успешна при общении с любым из серверов.
На шаге 3 повторное связывание строго не требуется, но в некоторых сценариях задействованы два разных исполняемых файла, поэтому я не могу использовать IADs
или DirectoryEntry
. Внутренне я думаю, что кишки Active Directory используют DsGetDcName , чтобы выбрать сервер для разговора, и в документах по этому поводу обсуждается, как он выбирает контроллер домена и как он кэширует эту информацию. К сожалению, это не то, что приложение может реально контролировать, насколько я могу судить. В некоторых случаях я вижу, как приложения последовательно подключаются к одному контроллеру домена или другому, но в других случаях приложения переключаются между контроллерами домена (как описано выше), и все не работает.
Приступая к актуальному вопросу: является ли это просто фундаментальным ограничением привязки на основе домена? Я думаю, что проблема исчезла бы, если бы я связался напрямую с конкретным контроллером домена, но это значительно усложняет код приложения, поэтому я надеялся избежать этого.