Должен ли я связываться с Active Directory, используя имя домена или имя контроллера домена? - PullRequest
4 голосов
/ 26 июля 2011

Я работаю над приложением, которое взаимодействует с 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, я неявно подключаюсь либо к левши, либо к праву. Вот пример сценария того, что происходит:

  1. Привязка к корню mydomain.com. Кишки Active Directory выбирают Lefty в качестве сервера для общения.
  2. Создайте новую OU под названием Container. Подразделение создано на левшей.
  3. Попытка привязки к новому подразделению. В Active Directory кишки выбирают Righty в качестве сервера для связи, поэтому привязка завершается неудачно, потому что Righty не знает о новом OU.
  4. Подождите 10-15 секунд и повторите попытку привязки. Привязка успешна при общении с любым из серверов.

На шаге 3 повторное связывание строго не требуется, но в некоторых сценариях задействованы два разных исполняемых файла, поэтому я не могу использовать IADs или DirectoryEntry. Внутренне я думаю, что кишки Active Directory используют DsGetDcName , чтобы выбрать сервер для разговора, и в документах по этому поводу обсуждается, как он выбирает контроллер домена и как он кэширует эту информацию. К сожалению, это не то, что приложение может реально контролировать, насколько я могу судить. В некоторых случаях я вижу, как приложения последовательно подключаются к одному контроллеру домена или другому, но в других случаях приложения переключаются между контроллерами домена (как описано выше), и все не работает.

Приступая к актуальному вопросу: является ли это просто фундаментальным ограничением привязки на основе домена? Я думаю, что проблема исчезла бы, если бы я связался напрямую с конкретным контроллером домена, но это значительно усложняет код приложения, поэтому я надеялся избежать этого.

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Это внутренняя проблема с репликациями сервера ldap.Я никогда не использовал c # api.Я работал на eDirectory на Linux.Сразу после создания объекта, если вы собираетесь ссылаться на него, лучше всего придерживаться сервера / DC.

Почему это усложнит приложение?написать функцию, чтобы подобрать сервер.Функция должна выполнить поиск DNS для домена (example.com), если у вас есть несколько контроллеров домена, она вернет весь IP-адрес, выберет тот, который работает (ping, ldap root dse search) и вернет его вызывающей стороне..

Попробуйте использовать функцию только в том случае, если вы столкнулись с проблемой, упомянутой выше.В других местах просто придерживайтесь домена.

0 голосов
/ 27 июля 2011

Сначала : я бы сказал, что @Kalyan: вы написали метод, который сначала выбирает контроллер домена в начале своей работы и хранит его в общем месте, а затем все EXE используют.

Second : вы, вероятно, можете принудительно выполнить репликацию из контроллера домена, на котором вы сначала создаете OU с помощью методов SyncReplicaFrom ... в классе DirectoryServer в System.DirctoryService.ActiveDirectory или использовать Interop with DsReplicaSyncAll Функция.Я не уверен, что этот второй способ является хорошим

Примечание: С точки зрения чистого LDAP, возможно, существует атрибут в RootDSE или в другом месте, который вызывает репликацию как 'schemaUpdateNow', заставляя перезагрузку SCHEMA.

...