Сергей Зернюков
Введение
Что такое ADAM и для чего он нужен?
Active Directory for Application Mode (ADAM) представляет собой локальную версию Active Directory (далее по тексту – AD), устанавливаемую в виде службы NT. ADAM предназначен для хранения данных, имеющих иерархическую структуру. Типичными примерами этого могут служить: глобальные адресные книги и системы работы с клиентами или персоналом. Конечно, иерархически организованные данные можно хранить и в XML-файле. Но это сомнительно с точки зрения безопасности, тем более, если хранимая информация является конфиденциальной. ADAM же использует встроенные механизмы безопасности Windows, что в большинстве случаев обеспечивает надежную защиту и прозрачный контроль доступа к данным. Самым удачным вариантом применения ADAM может быть хранение в Active Directory дополнительной информации об объектах.
Установка и начальная настройка
ADAM может быть установлен РЅР° операционной системе Microsoft Windows 2003 Server или Microsoft XP. РџРѕРґСЂРѕР±РЅРѕ процесс установки описан РІ руководстве, поставляемом вместе СЃ установочным пакетом. Здесь хотелось Р±С‹ остановиться только РЅР° РґРІСѓС… моментах. Первый касается разделов (partitions). Раздел РІ ADAM-Рµ является контейнером верхнего СѓСЂРѕРІРЅСЏ, РІ котором может храниться иерархия объектов. Р’ процессе установки создаются РґРІР° системных раздела: РѕРґРёРЅ для хранения схемы, РґСЂСѓРіРѕР№ для хранения конфигурации. РљСЂРѕРјРµ того, пользователю предлагается создать раздел, который будет использоваться приложением. Если РІС‹ точно знаете, как будет называться раздел данных приложения, введите РёРјСЏ раздела, Рё РѕРЅ будет создан РІРѕ время установки. Полное РёРјСЏ, или, РІ терминах AD – distinguished name, имеет следующий РІРёРґ: вЂOU=MyApp,O=MyCompany,C=RU’. Подробнее разделы Р±СѓРґСѓС‚ рассмотрены далее РІ статье.
Так же пользователю предлагается импортировать LDF-скрипты, расширяющие схему такими объектами как User и User-Proxy. Если вы собираетесь использовать объекты этих типов, вы можете создать эти классы в процессе установки. Если же изначально использование таких объектов не планируется, то импортировать ничего не нужно. В любом случае, это можно будет сделать и после установки.
Средства администрирования
Средства администрирования являются, на мой взгляд, одним из самых слабых мест ADAM – они представляют собой обширный набор различных, порой не очень удобных в использовании утилит (см. таблицу 1).
Утилита | Назначение |
ADAM ADSI Edit | MMC-приложение, позволяющее редактировать иерархию объектов и производить общую настройку работы ADAM. |
ADAM Schema | MMC-приложение для работы со схемой. |
Csvde.exe | Утилита командной строки для импорта и экспорта данных и обновления схемы с помощью текстовых comma-separated файлов. |
Dsmgmt.exe | Утилита командной строки для общего администрирования. |
Dsacls.exe | Утилита командной строки для просмотра и назначения прав доступа к объектам иерархии. |
Dsdbutil.exe | Утилита командной строки для управления файлами базы данных (.dit) ADAM. |
Dssiag.exe | Утилита командной строки для мониторинга ADAM. |
Ldifde.exe | Утилита командной строки для импорта и экспорта данных и обновления схемы с помощью файлов в формате LDAP Data Interchange Format (LDIF). |
Ldp.exe | Утилита для администрирования ADAM. |
Repadmin.exe | Утилита командной строки для управления репликацией. |
Таблица 1. Утилиты администрирования ADAM.
РР· этого СЃРїРёСЃРєР° РІРёРґРЅРѕ, что для администрирования РІ РѕСЃРЅРѕРІРЅРѕРј применяются утилиты командной строки, что никак нельзя назвать удобным. РљСЂРѕРјРµ того, поскольку, РІ большинстве случаев, сопровождением приложений занимаются люди, далекие РѕС‚ администрирования операционной системы – было Р±С‹ РЅРµ плохо иметь более удобные СЃРїРѕСЃРѕР±С‹ работы СЃ ADAM.
Почти РІСЃРµ представленные утилиты находятся РІ каталоге, РІ который был установлен ADAM, чаще всего это C:\WINDOWS\ADAM. Рсключение составляет ADAM Schema. Для подключения этой утилиты необходимо запустить Microsoft Management Console (MMC), РІ меню File добавить snap-in “ADAM Schema”, Р° затем сохранить файл .MMC.
Работа с ADAM
Понятие раздела
Важным понятием в ADAM является раздел (partition). Раздел является контейнером верхнего уровня, в котором может храниться иерархия объектов. Конечно, приложение может использовать и несколько разделов для хранения данных, однако осуществлять поиск и устанавливать связи между объектами можно только внутри одного раздела.
В процессе установки создаются два системных раздела, используемых для хранения конфигурации и схемы. Создать новый раздел можно с помощью утилиты LDP.EXE. Для этого надо запустить программу, подключиться к требуемой службе ADAM, установить соединение (bind) и выполнить несколько манипуляций, а именно:
В меню Browse выбрать пункт Add child.
В поле Dn ввести полное имя (distinguished name) нового раздела.
В поле Attribute ввести ObjectClass, в поле Values - container и нажать Enter.
Затем в поле Attribute ввести InstanceType, в поле Values – 5 и нажать Enter.
Нажать Run.
В
Рисунок 1. Утилита LDP.EXE - создание нового раздела.
Новый раздел будет создан, а вы получите сообщение об успешно выполненной операции.
Работа с данными в ADAM
После того как раздел создан, можно приступать к заполнению его данными, необходимыми для работы приложения. Единицей данных в ADAM является объект. Каждый объект имеет набор атрибутов, определяемых классом объекта. Некоторые из атрибутов являются общими для всех классов – атрибуты, унаследованные от класса top. Наиболее важные из них:
name – короткое имя объекта (MyObject1);
distinguishedName – полное имя объекта, уникальное в пределах сервера значение, идентифицирующее объект (CN= MyObject1,OU=MyApp,O=MyCompany,C=RU, см. ниже);
instanceType – системное значение, определяющее поведение объекта. В частности, этот атрибут указывает, может ли объект быть изменен вручную, или он является репликой объекта на сервере, с которым данный сервер синхронизируется.
objectClass – класс объекта, определяет набор атрибутов и поведение объекта.
distinguishedName содержит РёРјСЏ объекта, Р° так Р¶Рµ имена всех “контейнерных” объектов – каталогов, которые его содержат. Частью distinguishedName является полное РёРјСЏ раздела. РРјСЏ каждого объекта РІ полном имени предваряется префиксом, указывающим РЅР° тип объекта. Р’РѕС‚ расшифровка некоторых РёР· этих аббревиатур:
CN – common name,
OU – organization unit,
O – organization,
DC – domain component,
C – country/region.
Основным средством создания, модификации и удаления объектов в ADAM является “ADAM ADSI Edit”.
В
Рисунок 2. Внешний вид утилиты "ADAM ADSI Edit".
После подключения к нужному разделу нужного сервера можно добавлять собственные объекты в иерархию. В диалоговом окне создания нового объекта вам будет предложено выбрать класс, от которого будет унаследован объект. Объект определенного класса может содержать вложенные объекты классов, для которых он (класс) прописан в схеме как возможный “родитель”.
Расширение схемы
Описанное выше было бы совершенно бесполезно, если бы нельзя было расширять схему ADAM, то есть добавлять собственные классы и атрибуты. К счастью, Microsoft позаботился об этом, и в нашем распоряжении есть утилита “ADAM Schema”.
В
Рисунок 3. Внешний вид утилиты "ADAM Schema".
Схема – формальное описание содержимого и структуры службы каталогов – представляет собой набор связанных между собой классов, которые в свою очередь состоят из набора атрибутов.
Ниже приведены некоторые термины, необходимые для понимания сути схемы и принципов ее обновления.
1. Атрибут – поле данных, характеризующее какое-либо свойство объекта. Объект может содержать только атрибуты, прописанные в схеме для его класса.
2. Класс – формальное описание типа объекта в службе каталогов.
3. Объект – единица данных в службе каталогов.
4. Рдентификатор объекта (OID) – уникальное численное значение, однозначно идентифицирующее элемент данных, синтаксиса Рё прочие части распределенных приложений. Подобные идентификаторы РјРѕР¶РЅРѕ обнаружить РІ различных приложениях Рё системах, для которых важна глобальная уникальность элемента системы. Примеры таких приложений: приложения OSI, служба каталогов X.500 Рё SNMP. Рдентификаторы имеют древовидную структуру, РІ которой главный источник, такой как ISO, выделяет интервал/поддерево для использования младшими источниками идентификаторов, которые, РІ СЃРІРѕСЋ очередь, выделяют поддеревья для дочерних источников. Рассмотрим пример РёР· MSDN. OID = "1.2.840.113556.1.5.4". Здесь:
1 – ISO, корневой источник, выделил “1.2” для ANSI;
2 – ANSI, выделил “1.2.840” для США;
840 – США, выделил “1.2.840.113556” для Microsoft;
113556 – Microsoft;
1 – Microsoft DS;
5 – классы NTDS;
4 – класс Builtin-Domain.
5. X.500 – система стандартов, разработанная совместно ISO и ITU (известна как CCITT), которая определяет способы именования, представления данных и протоколы связи для служб каталогов.
6. Подкласс – класс, который наследуется от другого класса.
7. Суперкласс – класс, от которого унаследован один или более подклассов.
Схема описывает все атрибуты и классы. Для каждого класса должны быть определены следующие атрибуты:
Poss-superiors – описывает структуру дерева каталогов, определяя возможных “родителей” данного класса, то есть классы, в объекты которых может быть вложен объект данного класса.
Must-Contain – список атрибутов, обязательных для заполнения.
May-Contain – список атрибутов, доступных для заполнения.
Все классы непосредственно или опосредованно через свои суперклассы наследуются от абстрактного класса top.
ПРЕДУПРЕЖДЕНРР• Заметьте, что единожды созданный класс или атрибут невозможно удалить РёР· схемы РІ дальнейшем! Microsoft объясняет такое поведение тем, что РЅРµ может гарантировать отсутствия коллизий, если удаленный РІСЂРѕРґРµ Р±С‹ класс или атрибут РІСЃРµ еще будет использоваться РІ РґСЂСѓРіРёС… частях распределенной системы. РџРѕ той Р¶Рµ причине невозможно удалить РёР· класса обязательный атрибут. Набор Р¶Рµ необязательных атрибутов РјРѕР¶РЅРѕ изменять РІ любое время. Помните РѕР± этом РІРѕ время проектирования схемы. |
Добавление нового класса в схему сводится к выбору суперкласса, вводу имени нового класса, его OID-а X.500 и заполнению всех описанных выше обязательных атрибутов. Создать класс можно с помощью мастера создания нового класса утилиты “ADAM Schema”.
При добавлении атрибута необходимо ввести название нового атрибута, OID X.500, выбрать синтаксис или тип атрибута, задать интервал возможных значений и указать – является ли атрибут набором (списком) значений. Создать атрибут, как и класс, можно с помощью предусмотренного мастера создания нового атрибута в утилите “ADAM Schema”.
В
Рисунок 4. Диалоговое окно создания нового класса.
Управление пользователями и группами пользователей
Чтобы иметь возможность создавать учетные записи собственных пользователей ADAM, необходимо либо на этапе установки, либо позже с помощью утилиты Ldifde.exe, импортировать класс User, который определен в LDF-скрипте MS-User.LDF.
Для создания пользователя достаточно в “ADAM ADSI Edit” добавить новый объект класса User. После того, как новый пользователь добавлен, необходимо задать для него пароль. Утилита “ADAM ADSI Edit” позволяет сделать это из контекстного меню пользователя (пункт “Reset Password”). Поведение объекта класса User настраивается с помощью набора атрибутов. Некоторые из них:
msDS-UserAccountDisabled – если TRUE, учетная запись пользователя не активирована. Сразу после создания значение этого атрибута устанавливается в TRUE. Соответственно, для активации учетной записи нового пользователя необходимо вручную изменить значение на FALSE.
msDS-UserDontExpirePassword – если TRUE, указывает системе, что пароль данного пользователя имеет неограниченный срок действия.
msDS-UserPasswordExpired – значение TRUE данного атрибута говорит о том, что время действия текущего пароля закончилось, и требуется его смена.
Для управления правами доступа удобнее всего назначать права не напрямую пользователям, а группам пользователей. Такой алгоритм обеспечивает наиболее гибкое администрирование доступа к объектам службы каталогов. Здесь группы выступают в качестве ролей, которые определяют доступ к тем или иным частям дерева каталогов. Соответственно пользователь наследует права доступа у группы или нескольких групп, членом которых он является.
Чтобы создать РіСЂСѓРїРїСѓ пользователей, создается новый объект класса group. РџСЂРё создании надо РЅРµ забыть установить значение атрибута groupType равным 2147483650 (0x80000002 РІ шестнадцатеричном представлении). Рто значение указывает, что созданная РіСЂСѓРїРїР° является РіСЂСѓРїРїРѕР№ пользователей. Р—Р° связывание пользователей СЃ РіСЂСѓРїРїРѕР№ отвечает атрибут member класса group. “ADAM ADSI Edit” позволяет добавлять РІ РіСЂСѓРїРїСѓ как доменных пользователей, так Рё собственных пользователей ADAM.
Авторизация и управление правами доступа. Утилита DSACLS.EXE
Авторизация – это процесс определения, прав пользователя на доступ к объекту службы каталогов. Определение прав осуществляется на основе так называемых списков контроля доступа – Access Control List (ACLs). Утилита командной строки DSACLS.EXE позволяет просматривать и изменять права доступа пользователей и групп пользователей.
Полный список команд и ключей этой утилиты можно получить, запустив ее с ключом /?. Приведу два наиболее типичных случая применения.
Просмотр СЃРїРёСЃРєР° контроля доступа Рє объекту СЃ полным именем вЂCN=MyObject1,OU=MyApp,O=MyCompany,C=RU’:
dsacls.exe "\\localhost:389\ CN= MyObject1,OU=MyApp,O=MyCompany,C=RU" |
Установка прав РЅР° чтение объекта вЂCN= MyObject1,OU=MyApp,O=MyCompany,C=RU’ Рё объектов его поддерева РіСЂСѓРїРїРµ пользователей вЂCN=USER_GROUP,OU=MyApp,O=MyCompany,C=RU’:
dsacls.exe "\\localhost:389\ CN= MyObject1,OU=MyApp,O=MyCompany,C=RU" /I:T /G "CN=USER_GROUP,OU=MyApp,O=MyCompany,C=RU":GR |
Способы идентификации пользователей.
Подсоединиться к ADAM можно тремя разными способами: как пользователь Windows, как пользователь ADAM (класс User) или с помощью объекта класса UserProxy.
Во время установки ADAM запрашивает имя пользователя, который в дальнейшем будет администратором ADAM. По умолчанию это пользователь, устанавливающий ADAM. Все администраторы ADAM входят в группу пользователей Administrators, расположенную в разделе конфигурации; полное имя этой группы – CN=Administrators, CN=Roles, CN=Configuration, CN={идентификатор раздела конфигурации}. Таким образом, вы можете назначить свою учетную запись Windows администратором ADAM и подключаться в дальнейшем к ADAM как пользователь Windows. Точно так же можно создать свою группу в разделе приложения и добавить пользователей Windows в эту группу.
Если РІС‹ создали пользователя ADAM Рё назначили ему права доступа Рє объектам раздела приложения, РІС‹ можете подключаться Рє ADAM-Сѓ РѕС‚ имени этого пользователя. Рменем пользователя РІ этом случае будет полное РёРјСЏ (Distinguished Name) пользователя.
Кроме описанных выше двух способов, ADAM позволяет подключаться, используя так называемое перенаправление подключения, которое реализуется классом UserProxy. Объект класса UserProxy хранит в себе ссылку на пользователя Windows в AD. Такой режим может быть удобен, когда приложению необходима дополнительная информация (та, которой нет в Active Directory), связанная с пользователем Windows.
Пакетная обработка. Утилита LDIFDE.EXE
Р’СЃРµ вышеописанные инструменты обеспечивают достаточно средств для администрирования ADAM. Однако РІСЃРµ изменения, такие как добавление новых классов, объектов Рё пользователей, должны выполняться вручную. Рто РЅРµ очень СѓРґРѕР±РЅРѕ, особенно если есть необходимость повторять точно те Р¶Рµ действия РЅР° РґСЂСѓРіРѕРј сервере. Типичный пример – разработка ведется РЅР° компьютере разработчика, тестирование РЅР° специальном сервере тестирования, Р° работает приложение РЅР° рабочем сервере. Р’ этом случае было Р±С‹ СѓРґРѕР±РЅРѕ иметь возможность выполнять РІСЃРµ изменения РІ пакетном режиме. Такую возможность предоставляет утилита LDIFDE.EXE, которая позволяет экспортировать данные РёР· ADAM РІ LDF-скрипты Рё импортировать LDF-скрипты РІ ADAM. Рассмотрим типичные случаи применения этой утилиты, возникающие РїСЂРё разработке программного обеспечения.
РРєСЃРїРѕСЂС‚ всего поддерева CN=Personnel,OU=MyApp,O=MyCompany,C=RU РІ РІРёРґРµ, СѓРґРѕР±РЅРѕРј для дальнейшего импорта РЅР° РґСЂСѓРіРѕР№ сервер:
C:\WINDOWS\ADAM\ldifde.exe -f data.ldf -s localhost:389 -d " CN=Personnel,OU=MyApp,O=MyCompany,C=RU " -j . -p subtree -o "cn,distinguishedName,instanceType,whenCreated,whenChanged,uSNCreated,uSNChanged,objectGUID,objectCategory,dSCorePropagationData" |
РРјРїРѕСЂС‚ данных РІ ADAM:
ldifde -i -f data.ldf -s localhost:389 -j . –k |
Примеры команд LDF-скриптов.
Добавление группы пользователей:
dn: CN=USER_GROUP, OU=MyApp,O=MyCompany,C=RU changetype: add objectClass: top objectClass: group cn: Administrators instanceType: 4 groupType: 2147483650 |
Удаление объекта:
dn: CN=USER_GROUP, OU=MyApp,O=MyCompany,C=RU changetype: remove |
Рзменение объекта:
dn: CN=Object1, OU=MyApp,O=MyCompany,C=RU changetype: modify replace:Color Color: RED - |
Переименование объекта:
dn: CN=Object1, OU=MyApp,O=MyCompany,C=RU changetype: modrdn newrdn: CN=RenamedObject1 deleteoldrdn: 1 |
Для расширения схемы ADAM-а нужно использовать командную строку с указанием пространства имен схемы:
C:\WINDOWS\ADAM\LDIFDE.EXE -i -f SchemaExt.ldf -s localhost:389 -j . -c "CN=Schema,CN=Configuration,DC=X" #schemaNamingContext -k |
ПРЕДУПРЕЖДЕНРР• Заметьте, что если для обновления данных раздела, РјРѕР¶РЅРѕ использовать утилиту LDIFDE.EXE, идущую РІ поставке WINDOWS, то РїСЂРё изменении схемы ADAM необходимо использовать утилиту, установленную вместе СЃ ADAM, иначе команда вернет ошибку. |
Содержимое файла SchemaExt.ldf, используемого в примере:
#Добавление в схему нового атрибута: dn: CN=MyAttribute1,CN=Schema,CN=Configuration,DC=X changetype: ntdsschemaadd objectClass: top objectClass: attributeSchema attributeID: 1.3.444.656565.1.1 attributeSyntax: 2.5.5.12 isSingleValued: TRUE showInAdvancedViewOnly: TRUE adminDisplayName: MyAttribute1 oMSyntax: 64 lDAPDisplayName: MyAttribute1  #Добавление в схему нового класса: dn: CN=MyClass1,CN=Schema,CN=Configuration,DC=X changetype: ntdsschemaadd objectClass: top objectClass: classSchema possSuperiors: container subClassOf: top governsID: 1.3.444.656565.2.1 mayContain: MyAttribute1 showInAdvancedViewOnly: TRUE adminDisplayName: MyClass1 adminDescription: New class lDAPDisplayName: MyClass1  dn: changetype: modify add: schemaUpdateNow schemaUpdateNow: 1 - |
В этом примере первая команда создает новый атрибут MyAttribute1, а вторая – новый класс MyClass1, использующий этот атрибут. Последняя команда фиксирует изменения в схеме. Такая команда должна вызываться каждый раз после создания нового класса.
Способы взаимодействия приложения с ADAM
Для работы СЃ ADAM используются те Р¶Рµ средства, что Рё для работы СЃ AD. Рто – Active Directory Services Interfaces (ADSI), Lightweight Directory Access Protocol (LDAP), пространство имен System.DirectoryServices Microsoft .NET Framework, Р° также провайдер доступа Рє данным OLEDB ADsDSOObject.
ADSI предоставляет набор COM-интерфейсов для работы с ADAM и обеспечивает наиболее широкий набор инструментов.
LDAP – “облегченный” протокол доступа, позволяющий изменять содержимое службы каталогов и выполнять поиск по дереву объектов. LDAP может быть использован в приложениях, для которых работа с ADAM-ом не является основной функциональностью.
Пространство имен System.DirectoryServices (SDS) разработано на базе ADSI и предоставляет возможности, схожие с теми, что предоставляет протокол LDAP. SDS можно использовать в приложениях на базе технологии Microsoft.NET.
Провайдер доступа Рє данным ADsDSOObject предоставляет SQL-подобный интерфейс чтения, изменения Рё РїРѕРёСЃРєР° данных РІ AD. РР· всех описанных средств это обладает самой РЅРёР·РєРѕР№ производительностью, РЅРѕ РѕРЅРѕ может быть использовано РІ приложениях, выполняющих РїРѕРёСЃРє РІ ADAM, если скорость работы РЅРµ является критичной.
Работа с объектами: чтение, изменение и поиск данных
Рассмотрим работу с ADAM на примере, использующем пространство имен System.DirectoryServices.
В примере производится поиск, и в найденных объектах изменяется значение свойства MyAttribute1. Проверка существования значения атрибута не выполняется – предполагается, что оно существует. Также не выполняется обработка исключений. Сделано это для того, чтобы не загромождать код примера.
using System; using System.DirectoryServices; namespace SDSExample { В class SDSExample В { В [STAThread] В static void Main(string[] args) В { В //Подключение Рє ADAM-Сѓ В DirectoryEntry deRoot = В new DirectoryEntry( В "LDAP://LOCALHOST:389/CN=Personnel,OU=MyApp,O=MyCompany,C=RU"); В В //Создание объекта класса DirectorySearcher, выполняющего РїРѕРёСЃРє В DirectorySearcher dSeacher = В new DirectorySearcher(deRoot, "(objectClass=MyClass1)"); В //Указание искать РїРѕ всему поддереву корневого объекта В dSeacher.SearchScope = SearchScope.Subtree; В //РџРѕРёСЃРє всех объектов, удовлетворяющих условию В SearchResultCollection srEntries = dSeacher.FindAll(); В for(int index=0; index В { В //Вывод значений атирбутов объекта В SearchResult srEnrty = srEntries[index]; В Console.WriteLine(index); В Console.WriteLine("distinguishedName =" В + srEnrty.Properties["distinguishedName"]); В Console.WriteLine("MyAttribute1 =" В + srEnrty.Properties["MyAttribute1"][0]); В Console.WriteLine(); В //Рзменение значения атрибута MyAttribute1 В DirectoryEntry deEntry = srEnrty.GetDirectoryEntry(); В deEntry.Properties["MyAttribute1"].Value = В "new_value_of_Object" + index.ToString(); В //Фиксирование изменений В deEntry.CommitChanges(); В deEntry.Close(); В } В deRoot.Close(); В }//Main() В }//class SDSExample }//namespace SDSExample |
Работа с пользователями
Для некоторых приложений может потребоваться возможность управления пользователями ADAM (РЅРµ Windows). Работу СЃ пользователями РёР· приложения демонстрирует следующий пример. Р’ нем создается новый пользователь СЃ именем вЂCN=Vasiliy_Pupkin,CN=Users,OU=MyApp,O=MyCompany,C=RU’ Рё добавляется РІ РіСЂСѓРїРїСѓ вЂCN=USER_GROUP,OU=MyApp,O=MyCompany,C=RU’.
using System; using System.DirectoryServices; namespace ADAMUserExample {  class ADAMUser  {  [STAThread]  static void Main(string[] args)  {  DirectoryEntry deUserRoot =  new DirectoryEntry(  "LDAP://LOCALHOST:389/CN=Users,OU=MyApp,O=MyCompany,C=RU");  //Создание пользователя  DirectoryEntry deNewUser = deUserRoot.Children.Add(  "CN=Vasiliy_Pupkin", "User");  deNewUser.Properties["displayName"].Value = "Vasiliy Pupkin";  deNewUser.CommitChanges();  //назначение пароля  deNewUser.Properties["userpassword"].Value = "Vasiliy_Password_1";  deNewUser.CommitChanges();  //активирование пользователя  deNewUser.Properties["msds-useraccountdisabled"].Value = false;  //отмена срока действия пароля  deNewUser.Properties["msds-userdontexpirepassword"].Value = true;  deNewUser.CommitChanges();  DirectoryEntry deUserGroup =  new DirectoryEntry(  "LDAP:// LOCALHOST:389/CN=USER_GROUP,OU=MyApp,O=MyCompany,C=RU");  deUserGroup.Properties["member"].Add(  deNewUser.Properties["distinguishedName"].Value);  deUserGroup.CommitChanges();  deUserGroup.Close();  deNewUser.Close();  deUserRoot.Close();  }//Main  }//class ADAMUser } |
Однако если попытаться выполнить данный пример, используя конфигурацию ADAM РїРѕ умолчанию, возникнет ошибка РІ момент применения пароля пользователя. Рто произойдет потому, что конфигурация РїРѕ умолчанию запрещает смену пароля СЃ использованием незащищенного канала (РІ примере используется РїРѕСЂС‚ 389 – РїРѕСЂС‚ незащищенного канала, предлагаемый РїСЂРё установке ADAM). Р’РѕР·РјРѕР¶РЅС‹ РґРІР° варианта решения проблемы. Первый – настроить защищенный канал (РїРѕСЂС‚ защищенного канала, предлагаемый РїСЂРё установке, 636, использует SSL для шифрования канала) Рё подключаться Рє ADAM через него. Второй – настроить ADAM так, чтобы изменение пароля через незащищенное соединение было разрешено. Для этого необходимо установить тринадцатый СЃРёРјРІРѕР» атрибута dSHeuristics объекта конфигурации СЃ полным именем вЂCN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,CN={идентификатор раздела конфигурации ADAM-Р°}’ РІ вЂ1’. РџРѕ умолчанию значение этого атрибута РІ ADAM-Рµ РЅРµ установлено.
LDF-скрипт изменяющий соответствующим образом конфигурацию ADAM:
dn: CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=X changetype: modify replace: dSHeuristics dSHeuristics : 0000000001001 - |
Выполнить этот скрипт можно с помощью утилиты LDIFDE.EXE, как показано ниже.
c:\windows\adam\ldifde.exe -i -f config.ldf -s localhost.ldf -j . -c "CN=Configuration,DC=X" #configurationNamingContext -k |
Особенности использования ADAM в многопользовательских распределенных приложениях
Работа СЃ ADAM РёР· многопользовательских приложений имеет РѕРґРёРЅ нюанс, который необходимо учитывать РЅР° этапе проектирования системы. Нюанс этот касается возможности идентификации (authentication) пользователя ADAM. РџРѕ какой-то причине подключение Рє ADAM, как Рё Рє AD, РІРѕР·РјРѕР¶РЅРѕ только РїСЂРё наличии первичного контекста безопасности (primary security token) РІ процессе, обращающемся Рє ADAM. Рассмотрим РґРІР° случая: первый – РєРѕРіРґР° приложение работает РѕС‚ имени пользователя, информация Рѕ котором хранится РІ ADAM, Рё второй – РєРѕРіРґР° приложение работает РѕС‚ имени текущего пользователя Windows. Р’ первом случае идентификатор пользователя Рё пароль вводятся РїСЂРё запуске приложения. Обладая этой информацией, приложение может подключиться Рє ADAM РїРѕРґ первичным контекстом безопасности РІ любой СЃРІРѕР№ части (очень важно для распределенных приложений). Сложности возникают РІРѕ втором случае. Заключаются РѕРЅРё РІ том, что получить первичный контекст безопасности РјРѕР¶РЅРѕ только РЅР° том компьютере, РіРґРµ запущено клиентское приложение, СЃ которым работает пользователь. Ртим приложением может быть как Windows-клиент, работающий СЃ сервером приложений, так Рё Internet Explorer РІ случае Web-приложений. Р’ РѕР±РѕРёС… случаях приложению неизвестен пароль пользователя. РР·-Р·Р° этого возникает необходимость РІ передаче контекста безопасности СЃ клиента РЅР° сервер. Сделать это РјРѕР¶РЅРѕ СЃ помощью функций WinAPI InitializeSecurityContext Рё AcceptSecurityContext, которые позволяют зашифровать данные Рѕ контексте безопасности пользователя, передать РёС… РІ процесс сервера (РІРѕР·РјРѕР¶РЅРѕ, РЅР° РґСЂСѓРіРѕРј компьютере) Рё восстановить контекст безопасности РІ процессе сервера. Р’ этом случае для передачи контекста безопасности необходимо использовать механизм идентификации Kerberos, что РЅРµ всегда РІРѕР·РјРѕР¶РЅРѕ РёР·-Р·Р° сложности настройки Рё прочих причин, таких, как соединение клиента Рё сервера через Proxy-сервер. Рспользовать именно Kerberos РЅСѓР¶РЅРѕ потому, что этот механизм, РІ отличие РѕС‚ NTLM Рё Digest, позволяет передавать РїРѕ сети первичный идентификатор безопасности.
Рассмотрим для примера ASP.NET-приложение. Здесь существует возможность использовать интегрированную систему безопасности Windows для идентификации пользователя на сайте. После идентификации серверный код можно запустить под опознанным пользователем – так называемое имитирование (impersonation) контекста безопасности пользователя. Однако добиться таким образом желаемого результата – подключения к ADAM под пользователем приложения – не удастся. Подключение к ADAM из-под сымитированного контекста безопасности пользователя не возможно – необходим первичный контекст безопасности. В англоязычной литературе данная проблема носит название double-hop issue, что можно перевести как проблема двойного скачка. Она возникает всякий раз, когда необходимо передать контекст безопасности от одного процесса другому через процесс-посредник. В случае с ASP.NET-приложением процессом-источником является Internet Explorer, процессом-приемником – ADAM-а, а посредником является процесс ASP.NET.
Таким образом, при проектировании архитектуры приложения, в котором предполагается использовать ADAM, необходимо на раннем этапе позаботиться о способах подключения к ADAM и методах идентификации пользователей в случае многопользовательского приложения.
Заключение
РР· всего выше сказанного РјРѕР¶РЅРѕ сделать вывод, что ADAM является мощным инструментом, позволяющим использовать РІ приложении возможности Active Directory. Отчасти это так – ADAM позволяет расширять схему, создавать объекты этих классов, организовывать РёС… РІ иерархии, Р° также выполнять РїРѕРёСЃРє этих объектов. Гибкая система управления пользователями Рё контролем доступа предоставляет большие возможности для использования ADAM РІ приложениях, оперирующих конфиденциальной информацией. Механизмы архивирования Рё репликации позволяют создавать надежные отказоустойчивые системы.
Слабая эргономичность средств администрирования и некоторые трудности применения в многопользовательских приложениях несколько портят картину. Однако при грамотном проектировании использование ADAM может стать отличным выбором для широкого спектра программных систем.
Список литературы
Для подготовки данной работы были использованы материалы с сайта http://www.rsdn.ru/