Как создать атрибут в схеме Active Directory

Обновлено 13.02.2020

Active Directory logoДобрый день! Уважаемые читатели и гости одного их крупнейших IT блогов Pyatilistnik.org. В прошлый раз мы с вами научились чинить отсутствующий звук в Windows 10, сегодня же я хотел бы поговорить, о центральном сегменте управления в корпоративных сетях, Active Directory. Я бы хотел вас научить созданию дополнительных атрибутов в схеме Active Directory и рассказать, о всех нюансах с которыми я столкнулся на этой задаче.

Для чего нужно создавать атрибут в схеме

Ранее я вам описывал устройство схемы Active Directory и рассказывал, о ее назначении. Если в двух словах, то это просто база данных, в которой описываются все классы объектов и их атрибуты, используемые в классах. Приведу простой пример, есть пользователь Барбоскин Геннадий, у его учетной записи есть класс user и большой набор атрибутов, например:

Просмотр атрибутов пользователя через ADUC

Просмотр атрибутов пользователя через PowerShell

Каждый атрибут несет в себе какую-то информацию об объекте. Бывают ситуации, что вам необходимо создать новый атрибут и использовать его под специальный софт, например для Office 365 или G-Sute или для своих самописных систем. Основной смысл в том, что у вас есть специальный атрибут Active Directory, который будет как-то идентифицировать объект, благодаря этому вы можете назначать лицензии, права и кучу других вещей. Предположим, что я хочу чтобы у пользователя был атрибут Office365 и если он имеет определенное значение, то ему назначается лицензия, или атрибут locale (Язык интерфейса пользователя).

Алгоритм создания нового атрибута Active Directory

Все манипуляции я буду выполнять в своем тестовом лесу root.pyatilistnik.org построенном на контроллерах домена Windows Server 2012 R2. Если у вас контроллеры домена Windows Server 2008 R2, то вам необходимо создать ключ реестра, который будет позволять расширять схему.

В случае со старыми W2008R2 вам нужно открыть окно выполнить и запустить regedit. Далее вы переходите в ветку:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\NTDS\Parameters

Тут вам необходимо создать новый ключ "Параметр DWORD (32 бита)"

Создание ключа реестра, чтобы разрешить расширение схемы Active Directory

И дать ему название Schema Update Allowed со значением "1". Это даст теперь производить редактирование схемы.

Алгоритм создания нового атрибута Active Directory

Далее вы должны открыть оснастку ADUC (Active Directory Пользователи и компьютеры) и найти в контейнере "Users" группу "Администраторы схемы". В нее вам необходимо добавить пользователя, кто будет расширять схему и создавать новый атрибут пользователя. В моем примере это будет ROOT\Администратор.

Добавление пользователя в группу администраторы схемы

Далее у вас должна быть зарегистрирована и открыта оснастка "Схема Active Directory". В оснастке "Схема Active Directory" у вас будет два контейнера, первый это "Классы".

Список классов в оснастке схема Active Directory

Я нашел класс "user" и открыл его свойства. На вкладке "Атрибуты" вы можете посмотреть какие атрибуты добавлены для данного класса. Тут же есть кнопка добавления, но нам пока нечего добавлять.

Свойства класса в схеме Active Directory

Переходим в раздел "Атрибуты". Тут список будет куда существеннее. Для примера я открою атрибут 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)

Свойства атрибута в схеме Active Directory

Напоминаю, что я хочу создать два атрибута Office365 и locale. Перед тем, как мы это сделаем очень важно проверить, что таких еще нет. Для этого откройте PowerShell и воспользуйтесь вот таким скриптом.

Первый ищет Office* среди атрибутов и классов.

Get-ADObject -filter * -SearchBase $schemaPath -Properties * | where {$_.lDAPDisplayName -like "Office*"} | select lDAPDisplayName | FT -AutoSize
Get-ADObject -filter * -SearchBase $schemaPath -Properties * | where {$_.Name -like "Office*"} | select Name | FT -AutoSize

Поиск атрибутов в схеме Active Directory

Второй ищет все значения начинающиеся на loc*

Get-ADObject -filter * -SearchBase $schemaPath -Properties * | where {$_.lDAPDisplayName -like "loc*"} | select lDAPDisplayName | FT -AutoSize
Get-ADObject -filter * -SearchBase $schemaPath -Properties * | where {$_.Name -like "lo*"} | select Name | FT -AutoSize

Поиск атрибутов в схеме Active Directory

В первом случае значений "Office" в полях LDAPDisplayName и Name нет, вот на loc*, что-то нашлось, но там нет имени locale. В результате я могу создавать нужные мне атрибуты с моими именами, но сначала нам необходимо получить корневой OID.

Microsoft рекомендует: Вместо того, чтобы напрямую добавлять пользовательский атрибут в существующий класс, мы всегда должны создавать вспомогательный класс и добавлять туда атрибут. Затем этот вспомогательный класс может быть связан с классом, где требуется новый атрибут.

Формирование X.500-кода объекта (X.500.OID)

Идентификаторы объектов (OID) представляют собой уникальные числовые значения, выдаваемые различными органами выдачи для уникальной идентификации элементов данных, синтаксисов и других частей распределенных приложений. OID можно найти в приложениях OSI, каталогах X.500, SNMP и других приложениях, где важна уникальность. OID основаны на древовидной структуре, в которой вышестоящий орган выдачи, такой как ISO, выделяет ветвь дерева для субавторита, который, в свою очередь, может выделять подветвления.

Протокол LDAP (RFC 2251) требует, чтобы служба каталогов идентифицировала классы объектов, атрибуты и синтаксисы с помощью OID. Это часть наследства LDAP X.500.

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

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 - класс пользователя, назначено организацией.

Формирование X.500-кода объекта (X.500.OID)

Вот пример OID из моего тестового окружения, для атрибута Last-Logon (1.2.840.113556.1.4.52).

пример OID из моего тестового окружения, для атрибута Last-Logon

А вот пример OID у Last-Logon-Timestamp (1.2.840.113556.1.4.1696), как видите последние цифры отвечающие за номер атрибута уникальны.

пример OID у Last-Logon-Timestamp

Еще хочу отметить, что если вы будите запрашивать в PowerShell свойства у класса и свойства у атрибута, то вы увидите там такие наименования:

  • governsID- это OID у классов
  • attributeID - это OID у атрибутов

Чтобы понять какие номера OID для классов и для атрибутов у вас используется вы можете воспользоваться моими скриптами PowerShell. Единственное вам необходимо подставить свои данные. Поиск всех используемых governsID (OID классов):

$schemaPath = (Get-ADRootDSE).schemaNamingContext
$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"
}
}

Поиск всех используемых governsID (OID классов)

Поиск всех используемых attributeID (OID атрибутов):

$schemaPath = (Get-ADRootDSE).schemaNamingContext
$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"
}
}

Поиск всех используемых attributeID (OID атрибутов):

Получив эти данные вы можете вычислить последний используемый номер для нужного объекта и взять следующий, но все же правильнее создавать отдельный корневой 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. Для этого пройдите по ссылке:

https://gallery.technet.microsoft.com/scriptcenter/56b78004-40d0-41cf-b95e-6e795b2e8a06

Получение корневого OID

Этот сценарий можно использовать для рабочей среды Test/Dev/ Mid-size. Однако для крупных предприятий передовой опыт требует, чтобы они получали глобально уникальное пространство имен OID непосредственно из IANA и выдавали OID оттуда

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

Можете у меня скачать данный скрипт, там будет две версии, первая создает текстовый файл, а вторая нет (не забываем поправить в файле место сохранения файла)

Формирование корневого OID для схемы Active Directory

Получение корневого OID

Я сформировал два разных корневых OID, использовать я буду один, просто показал как скрипт может выводить, это в файл. Использовать я буду:

1.2.840.113556.1.8000.2554.26635.62400.10599.20190. 44772.8900271.2416092

Далее руководство от 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" выберите контейнер "Классы" и щелкните по нему правым кликом, из контекстного меню выберите "Создать класс".

Создание вспомогательного класса в схеме Active Directory

Вас предупредят, что все созданные классы нельзя будет удалить.

Как создать вспомогательный класс в 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. Структурный класс может быть подклассом абстрактного или структурного класса. Структурный класс может включать в себя любое количество вспомогательных классов в своем определении.

Типы вспомогательных классов AD

Просто нажимаем "Готово".

Создание вспомогательного класса в Active Directory

В результате мы видим наш новый вспомогательный класс.

Успешно созданный вспомогательный класс в AD

Создаем новый атрибут

Первым я создам атрибут locale. Щелкаем правым кликом по контейнеру "Атрибуты" и из контекстного меню выбираем пункт "Создать атрибут".

Как создать атрибут в схеме Active Directory

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

Предупреждение при создании нового атрибута в схеме Active Directory

Перед вами откроется окно "Создание нового атрибута". Тут вы должны заполнить:

    • Общее имя (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)

Создание нового атрибута в Active Directory

Как видим мой новый атрибут успешно создан.

Успешно созданный атрибут Active Directory

Далее открываем свойства вспомогательного класса Class-locale и переходим на вкладку "Атрибуты". Нажимаем кнопку добавить. В открывшемся списке находим наш новый атрибут locale.

Добавление атрибута в вспомогательный класс

Теперь вам нужно открыть свойства класса user и перейти на вкладку "Отношения". В разделе "Вспомогательные классы" нажмите кнопку добавить. Из списка выберите наш вспомогательный класс classLocale.

Добавление вспомогательного класса к основному классу AD

Теперь все готово и наш пользователь будет иметь атрибут locale. Хочу отметить, что он появится не сразу в свойствах пользователя, может пройти минут 15-20. Теперь для второго атрибута Office365 нужно сделать то же самое, создать его как атрибут, далее добавить во вспомогательный класс и все. Он так же появится у пользователя.

Как создать атрибут в Active Directory

Для ускорения вы можете перезагрузить схему.

Перезагрузка схемы Active Directory

Дополнительная документация

  • 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.

Автор - Сёмин Иван

2 Responses to Как создать атрибут в схеме Active Directory

  1. Алексей:

    Спасибо за подробную инструкцию.
    Но все же для самых невнимательных я бы изменил скриншот с выбором типа класса и выделил там «особый». Например я уже создал структурный один)

  2. Алексей:

    Отличная статья.
    Но я бы заменил подправил скрин с выбором типа класса: где указано что выбирается Особый. Я прокололся)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *