понедельник, 8 августа 2011 г.

Подводный камни Active Directory: версионность объектов, как она есть

Если вы решаете задачу синхронизации объектов в Active Directory или просто следите за их изменениями для иных нужд, то в какой-то момент времени вам непременно придёт в голову "гениальная" идея: постойте, AD просто обязана содержать встроенный механизм версионности объектов, почему бы не воспользоваться им для оптимизации поиска изменившихся объектов?

Быстрый поиск в Интернете даст утвердительный ответ на ваше предположение. Так и есть: контроль версионности объектов в Active Directory реализуется через значение целочисленного атрибута uSNChanged. И реализуется он вот таким нехитрым способом: контроллер домена изменяет значение этого свойства при любом изменении объекта. Причём новое значение всегда больше предыдущего и больше текущих значений этого атрибута всех остальных объектов, контролируемых этим контроллером домена.

 
Тот, кто прочитал больше одной заметки с передовой, знает, что практически у любой темы есть своё НО. Этот случай – не исключение. Большинство описаний атрибута uSNChanged в Интернете не упоминают того факта, что он не реплицируемый. Каждый контроллер домена содержит свою уникальную версию атрибута uSNChanged для каждого объекта! Поэтому сравнивать между собой можно лишь значения этого атрибута, полученные в разное время, но с одного и того же контроллера домена.

 
Итак, если вам понадобится следить за версионностью объектов в Active Directory и выбирать лишь те объекты, которые были изменены со времени последнего сравнения, поступайте следующим образом:
  1. При первом запуске извлеките из объекта rootDSE и запомните имя связанного контроллера домена и значение атрибута highestCommittedUSN – это максимальное на текущий момент значение uSNChanged для данного контроллера.
  2. При последующих запусках используйте имя контроллера домена из rootDSE для поиска в вашем хранилище предыдущего максимального значения uSNChanged. Если такое не обнаруживается, то повторяйте для нового контроллера процедуру инициализации из 1-ого пункта.
  3. В случае обнаружения сохранённого максимального значения uSNChanged, сравните его с новым значением highestCommittedUSN из rootDSE. Если новое значение оказывается больше предыдущего – это означает, что в Active Directory произошли изменения, в этом случае выполните поиск всех объектов, значение uSNChanged которых больше сохранённого – это и есть искомые объекты.
  4. Запомните новое значение highestCommittedUSN.

Как несложно догадаться, явное связывание с постоянным контроллером домена упрощает данный алгоритм и делает его чуть более эффективным. Это наблюдение является ещё одним аргументом за подобную стратегию выбора контроллера домена в дополнение к уже обсуждавшимся ранее проблемам с производительностью при поиске, когда выбор контроллера остаётся на совести ADSI.

Комментариев нет:

Отправить комментарий