Как создать атрибут в схеме Active Directory
Добрый день! Уважаемые читатели и гости одного их крупнейших IT блогов Pyatilistnik.org. В прошлый раз мы с вами научились чинить отсутствующий звук в Windows 10, сегодня же я хотел бы поговорить, о центральном сегменте управления в корпоративных сетях, Active Directory. Я бы хотел вас научить созданию дополнительных атрибутов в схеме Active Directory и рассказать, о всех нюансах с которыми я столкнулся на этой задаче.
Для чего нужно создавать атрибут в схеме
Ранее я вам описывал устройство схемы Active Directory и рассказывал, о ее назначении. Если в двух словах, то это просто база данных, в которой описываются все классы объектов и их атрибуты, используемые в классах. Приведу простой пример, есть пользователь Барбоскин Геннадий, у его учетной записи есть класс user и большой набор атрибутов, например:
- CanonicalName
- DistinguishedName
- GivenName
- objectSid
- lastLogoff
- lastLogon
- LastLogonDate
- lastLogonTimestamp
Каждый атрибут несет в себе какую-то информацию об объекте. Бывают ситуации, что вам необходимо создать новый атрибут и использовать его под специальный софт, например для Office 365 или G-Sute или для своих самописных систем. Основной смысл в том, что у вас есть специальный атрибут Active Directory, который будет как-то идентифицировать объект, благодаря этому вы можете назначать лицензии, права и кучу других вещей. Предположим, что я хочу чтобы у пользователя был атрибут Office365 и если он имеет определенное значение, то ему назначается лицензия, или атрибут locale (Язык интерфейса пользователя).
Алгоритм создания нового атрибута Active Directory
Все манипуляции я буду выполнять в своем тестовом лесу root.pyatilistnik.org построенном на контроллерах домена Windows Server 2012 R2. Если у вас контроллеры домена Windows Server 2008 R2, то вам необходимо создать ключ реестра, который будет позволять расширять схему.
В случае со старыми W2008R2 вам нужно открыть окно выполнить и запустить regedit. Далее вы переходите в ветку:
Тут вам необходимо создать новый ключ "Параметр DWORD (32 бита)"
И дать ему название Schema Update Allowed со значением "1". Это даст теперь производить редактирование схемы.
Далее вы должны открыть оснастку ADUC (Active Directory Пользователи и компьютеры) и найти в контейнере "Users" группу "Администраторы схемы". В нее вам необходимо добавить пользователя, кто будет расширять схему и создавать новый атрибут пользователя. В моем примере это будет ROOT\Администратор.
Далее у вас должна быть зарегистрирована и открыта оснастка "Схема Active Directory". В оснастке "Схема Active Directory" у вас будет два контейнера, первый это "Классы".
Я нашел класс "user" и открыл его свойства. На вкладке "Атрибуты" вы можете посмотреть какие атрибуты добавлены для данного класса. Тут же есть кнопка добавления, но нам пока нечего добавлять.
Переходим в раздел "Атрибуты". Тут список будет куда существеннее. Для примера я открою атрибут lastLogon они имеет такие базовые атрибуты:
- Описание (Description)
- Общее имя (Common Name)
- X.500.OID
- Синтаксис (Syntax)
- Минимум (Minimum)
- Максимум (Mazimum)
- Этот атрибут активен (Attribute is active)
- Индексировать атрибут (index this attribute)
- Выполнять разрешения неоднозначных имен (ANR -Ambiguous Name Resolution)
- Реплицировать этот атрибут в глобальный каталог (Replicate this attribute to the Global Catalog)
- Копировать атрибут при копировании учетной записи (Attribute is copied when duplicate a user)
- Индексировать атрибут для контейнерного поиска (Index this attribute for containerized searches)
Напоминаю, что я хочу создать два атрибута Office365 и locale. Перед тем, как мы это сделаем очень важно проверить, что таких еще нет. Для этого откройте PowerShell и воспользуйтесь вот таким скриптом.
Первый ищет Office* среди атрибутов и классов.
Get-ADObject -filter * -SearchBase $schemaPath -Properties * | where {$_.Name -like "Office*"} | select Name | FT -AutoSize
Второй ищет все значения начинающиеся на loc*
Get-ADObject -filter * -SearchBase $schemaPath -Properties * | where {$_.Name -like "lo*"} | select Name | FT -AutoSize
В первом случае значений "Office" в полях LDAPDisplayName и Name нет, вот на loc*, что-то нашлось, но там нет имени locale. В результате я могу создавать нужные мне атрибуты с моими именами, но сначала нам необходимо получить корневой OID.
Формирование X.500-кода объекта (X.500.OID)
Идентификаторы объектов (OID) представляют собой уникальные числовые значения, выдаваемые различными органами выдачи для уникальной идентификации элементов данных, синтаксисов и других частей распределенных приложений. OID можно найти в приложениях OSI, каталогах X.500, SNMP и других приложениях, где важна уникальность. OID основаны на древовидной структуре, в которой вышестоящий орган выдачи, такой как ISO, выделяет ветвь дерева для субавторита, который, в свою очередь, может выделять подветвления.
Протокол LDAP (RFC 2251) требует, чтобы служба каталогов идентифицировала классы объектов, атрибуты и синтаксисы с помощью OID. Это часть наследства LDAP X.500.
OID в доменных службах Active Directory включают обозначения, выпущенные ISO или Microsoft для классов и атрибутов X.500. Обозначение OID представляет собой пунктирную строку чисел, например как в Microsoft "1.2.840.113556.1.5.9". Тут обозначения будут иметь такую расшифровку:
- 1 - Это означает корневую организацию выдавшего OID, в данном случае это ISO
- 2 - означает ANSI, это обозначение группы, присвоенное ISO
- 840 - Назначение страны/региона, назначенное группой, в данном случае США
- 113556 - Наименование организации, присвоенное страной/регионом, в данном случае Microsoft
- 1 - Организацией назначено Active Directory
- 5 - Обозначение класса
- 9 - класс пользователя, назначено организацией.
Вот пример OID из моего тестового окружения, для атрибута Last-Logon (1.2.840.113556.1.4.52).
А вот пример OID у Last-Logon-Timestamp (1.2.840.113556.1.4.1696), как видите последние цифры отвечающие за номер атрибута уникальны.
Еще хочу отметить, что если вы будите запрашивать в PowerShell свойства у класса и свойства у атрибута, то вы увидите там такие наименования:
- governsID- это OID у классов
- attributeID - это OID у атрибутов
Чтобы понять какие номера OID для классов и для атрибутов у вас используется вы можете воспользоваться моими скриптами PowerShell. Единственное вам необходимо подставить свои данные. Поиск всех используемых governsID (OID классов):
$objects = Get-ADObject -SearchBase $schemaPath -Properties governsID -Filter *
foreach ($object in $objects)
{
if (! $object.governsID) {Continue}
$governsID = $null
$governsID = $($object.governsID).Tostring()
if ($governsID -like "1.2.840.113556.1.5.*")
{
"$($object.Name);$governsID"
}
}
Поиск всех используемых attributeID (OID атрибутов):
$objects = Get-ADObject -SearchBase $schemaPath -Properties attributeID -Filter *
foreach ($object in $objects)
{
if (! $object.attributeID) {Continue}
$attributeID = $null
$attributeID = $($object.attributeID).Tostring()
if ($attributeID -like "1.2.840.113556.1.4.*")
{
"$($object.Name);$attributeID"
}
}
Получив эти данные вы можете вычислить последний используемый номер для нужного объекта и взять следующий, но все же правильнее создавать отдельный корневой OID.
Получение корневого OID от компании регистрации имени ISO или через скрипт
Предпочтительный способ получения идентификатора корневого объекта (OID) - это запросить его у службы регистрации имен, международной организации по стандартизации (ISO). Это разовое действие, когда вы получили корневой OID, он определяет ваше пространство OID, и вы можете управлять им самостоятельно.
Обычно взимается плата за регистрацию названия организации и получение корневого OID. Сборы и правила регистрации зависят от страны/региона. В США ISO NRA - это Американский национальный институт стандартов (ANSI). Для получения дополнительной информации о процедуре регистрации в ANSI и графике оплаты см. https://web.ansi.org. ISO ведет список организаций-членов по адресу https://www.iso.ch. Если вы находитесь за пределами США, вам следует обратиться к организации-члену ISO в вашей стране/регионе за информацией о регистрации имени.
Независимо от источника, использованного для получения OID, если вы намереваетесь расширить схему Active Directory и хотите подать заявку на получение логотипа Certified for Windows, вы должны зарегистрировать свой OID в Microsoft. Для получения дополнительной информации о том, как зарегистрировать свой OID в Microsoft, смотрите статью "Получение идентификатора объекта от Microsoft (https://docs.microsoft.com/en-us/windows/win32/ad/obtaining-an-object-identifier-from-microsoft)".
Для регистрации корневого OID от Microsoft вы может воспользоваться vbs скриптом, который написал один из инженеров MS. Для этого пройдите по ссылке:
Вы должны создать текстовый файл, вставить в него данный текст и изменить расширение на vbs. После чего откройте командную строку от имени администратора и запустите ваш скрипт.
Я сформировал два разных корневых OID, использовать я буду один, просто показал как скрипт может выводить, это в файл. Использовать я буду:
Далее руководство от Microsoft рекомендует нам: получив корневой OID, рекомендуется создавать не более двух категорий OID. Вы можете создавать последующие OID для новых классов и атрибутов схемы, добавляя цифры к OID в форме OID.X, где X может быть любым выбранным вами числом. Общее расширение схемы обычно использует следующую структуру:
- 1.2.840.113556.1.8000.2554.26635.62400.10599.20190. 44772.8900271.2416092.1.2 - Это у меня будут классы, следующий будет 1.2.840.113556.1.8000.2554.26635.62400.10599.20190. 44772.8900271.2416092.1.3 и так далее
- 1.2.840.113556.1.8000.2554.26635.62400.10599.20190. 44772.8900271.2416092.2.1 - Это у меня будет отдано атрибутам, следующий будет 1.2.840.113556.1.8000.2554.26635.62400.10599.20190. 44772.8900271.2416092.2.2 и так далее
Создание вспомогательного класса
Как я писал выше Microsoft рекомендует создавать дополнительные, вспомогательные классы и уже их прикреплять к основным, базовым классам. В оснастке "Схема Active Directory" выберите контейнер "Классы" и щелкните по нему правым кликом, из контекстного меню выберите "Создать класс".
Вас предупредят, что все созданные классы нельзя будет удалить.
Задаем значения:
- Общее имя - Class-locale
- Выводимое имя LDAP - classLocale
- X500-код объекта - 1.2.840.113556.1.8000.2554.26635.62400.10599.20190.44772.8900271.2416092.1.1
- Описание - Язык интерфейса пользователя
- Тип класса - Особый
Абстрактные классы (abstract). Объекты classSchema (иначе говоря, классы), относящиеся к абстрактной категории, выступают в качестве формальных параметров-заполнителей; эти классы нельзя использовать для создания экземпляра объекта в другом контексте именования AD. В службе AD абстрактные классы используются главным образом как родительские классы других классов, или суперклассы, так что администратор может создавать иерархическую структуру из объектных классов и определять систему наследования атрибутов между классами (в атрибуте subClasOf каждого класса хранится имя его суперкласса). Хотя наследование и не является прерогативой абстрактных классов, это именно то качество, из-за которого данные классы используются. Значение атрибута objectClassCategory абстрактных объектов classSchema равно 2. Абстрактный класс, который является шаблоном, используемым для получения новых абстрактных, вспомогательных и структурных классов. Абстрактный класс может быть только подклассом абстрактного класса. Абстрактные классы не могут быть созданы в доменных службах Active Directory. Абстрактный класс может включать в себя любое количество вспомогательных классов в своем определении.
Так как класс User имеет тип структурный, то вспомогательный класс у нас не может быть абстрактным.
Вспомогательный класс (Особый) (auxiliary). Вспомогательные объекты classSchema подобны абстрактным классам в том, что они тоже не используются для создания экземпляров объектов AD. Вспомогательные классы напоминают файлы include и заголовочные файлы; с помощью этой категории классов можно включать набор из нескольких атрибутов в определение другого класса. Атрибуты systemAuxiliaryClass и auxiliaryClass являются атрибутами, которые способны содержать несколько значений (multivalue attributes). Иными словами, одному объекту classSchema можно поставить в соответствие множество вспомогательных классов. Атрибут с одним значением (single-value attribute) может содержать только одно значение, тогда как атрибут со множеством значений может содержать несколько значений. Вспомогательный класс может быть подклассом абстрактного, вспомогательного или структурного класса
Структурный класс. Это единственный тип класса, с помощью которого можно создавать экземпляры объектов в других контекстах именования службы AD. Определения классов, внутри которых могут располагаться созданные экземпляры класса, определяемого объектами classSchema, содержатся в атрибутах systemPossSuperiors и possSuperiors. Так, принадлежащий классу user атрибут systemPossSuperiors определяет класс organizationalUnit в качестве возможного контейнера для экземпляров класса user, поэтому объект User можно создавать в экземпляре класса organizationalUnit. Эти определения известны как правила реализации (instantiation rules). Значение атрибута objectClassCategory структурных объектов classSchema равно 3.
Структурный класс, который является единственным типом класса, который может иметь экземпляры в доменных службах Active Directory. Структурный класс может быть подклассом абстрактного или структурного класса. Структурный класс может включать в себя любое количество вспомогательных классов в своем определении.
Просто нажимаем "Готово".
В результате мы видим наш новый вспомогательный класс.
Создаем новый атрибут
Первым я создам атрибут locale. Щелкаем правым кликом по контейнеру "Атрибуты" и из контекстного меню выбираем пункт "Создать атрибут".
Вас предупредят, что удалить созданный вами объект в схеме AD вы не сможете удалить, только отключить.
Перед вами откроется окно "Создание нового атрибута". Тут вы должны заполнить:
- Общее имя (Common Name) - Заполняется латинскими буквами, без пробелов. Будет фигурировать как поле "Name". Locale
- Выводимое имя LDAP (LDAP Display Name) - Имя атрибута в запросе LDAP. Будет выводится в поле lDAPDisplayName. locale
- Описание (Description)
- X.500-код объекта (X.500.OID) - 1.2.840.113556.1.8000.2554.26635.62400.10599.20190.44772.8900271.2416092.2.1
- Синтаксис - Строка Юникода
- Минимум (Minimum)
- Максимум (Mazimum)
Как видим мой новый атрибут успешно создан.
Далее открываем свойства вспомогательного класса Class-locale и переходим на вкладку "Атрибуты". Нажимаем кнопку добавить. В открывшемся списке находим наш новый атрибут locale.
Теперь вам нужно открыть свойства класса user и перейти на вкладку "Отношения". В разделе "Вспомогательные классы" нажмите кнопку добавить. Из списка выберите наш вспомогательный класс classLocale.
Теперь все готово и наш пользователь будет иметь атрибут locale. Хочу отметить, что он появится не сразу в свойствах пользователя, может пройти минут 15-20. Теперь для второго атрибута Office365 нужно сделать то же самое, создать его как атрибут, далее добавить во вспомогательный класс и все. Он так же появится у пользователя.
Для ускорения вы можете перезагрузить схему.
Дополнительная документация
- https://docs.microsoft.com/en-us/powershell/module/addsadministration/get-adobject?view=win10-ps
- https://social.technet.microsoft.com/wiki/contents/articles/51121.active-directory-how-to-add-custom-attribute-to-schema.aspx#X_5OO_and_OID_Namespace
- https://docs.microsoft.com/en-us/windows/win32/ad/object-identifiers
- https://docs.microsoft.com/en-us/windows/win32/ad/obtaining-a-root-oid-from-an-iso-name-registration-authority
- https://docs.microsoft.com/en-us/windows/win32/ad/obtaining-an-object-identifier-from-microsoft
На этом у меня все. Надуюсь, что вы разобрались, что создание атрибута не такое уж и сложное дело. На этом у меня все, если остались вопросы, то жду их в комментариях. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.
Спасибо за подробную инструкцию.
Но все же для самых невнимательных я бы изменил скриншот с выбором типа класса и выделил там «особый». Например я уже создал структурный один)
Отличная статья.
Но я бы заменил подправил скрин с выбором типа класса: где указано что выбирается Особый. Я прокололся)