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


Об авторе оригинального текста:
Тим Бантрок — администратор Active Directory в крупной компании, которая специализируется на колл-центрах. Сертифицированный специалист MCTS, MCITP, MCSA и MCPS.

Админы порой любят копировать аккаунты пользователей из соображений удобства: автоматически перенесутся и дополнительные атрибуты, которые иначе пришлось бы настраивать вручную. Но в некоторых случаях такой подход чреват проблемами.


К примеру, вы используете атрибут extensionAttribute1 в качестве уникального ID ящика, чтобы переносить этот ящик из одной системы Microsoft Exchange в другую, расположенную в отдельном лесу AD. Если у какого-то пользователя этот ID окажется аналогичным, синхронизация не пройдет. Либо Exchange синхронизирует письма в чужой ящик.


Но можно предотвратить копирование определенного атрибута, если отключить опцию Attribute is copied when duplicating a user в Active Directory.


Чтобы это сделать, необходимо обладать правами администратора схемы (не забудьте удалить свой аккаунт из этой группы, когда закончите с настройками). Деактивировать опцию копирования атрибута extensionAttribute1 можно следующим образом:


  1. Запустите консоль PowerShell от имени администратора.
  2. По умолчанию оснастка Active Directory Schema не зарегистрирована в MMC. Сделаем это командой:
    regsvr32 schmmgmt.dll
  3. Теперь добавим оснастку Active Directory Schema в MMC.

    Добавление оснастки AD Schema.
  4. В консоли выберите папку Attributes, затем щелкните правой кнопкой на extensionAttribute1 и выберите Properties. Снимите флажок Attribute is copied when duplicating a user и нажмите OK.

    Снимите флажок Attribute is copied when duplicating a user.

Ищем подлежащие копированию атрибуты


Чтобы определить, какие из атрибутов будут скопированы, а какие нет, можно заглянуть в консоль AD Schema. Но просматривать все ее параметры вручную неудобно.


Поэтому для автоматизации процесса используем PowerShell:


  • потребуется команда Get-ADObject, с помощью которой можно получить объект пользователя;
  • еще нужна будет команда Get-ADRootDSE, возвращающая объект корня каталога — из него возьмем schemaNamingContext.
    Значение schemaNamingContext определяет область поиска (SearchBase) и выглядит примерно как CN=Schema,CN=Configuration,DC=domain,DC=com.
    -SearchBase $((Get-ADRootDSE).schemaNamingContext)
  • и последний недостающий компонент — LDAPFilter. Для начала применим фильтр по objectClassattributeSchema. Фильтр вернет только атрибуты схемы.

Теперь нужно применить фильтр по идентификатору объекта (OID). OID представляет собой числовую последовательность, формат которой определяет стандарт RFC1778. Такой формат стандартен для внутренних представлений большинства LDAP-совместимых каталогов.


Используйте следующий синтаксис: <Имя атрибута>:< OID>:=<десятичное значение>.


  • <Имя атрибута> — это searchFlags;
  • < OID> должен быть равен 1.2.840.113556.1.4.803. Идентификатор уникален в Active Directory, и соответствие будет только в случае побитового совпадения атрибута с указанным значением (LDAP_MATCHING_RULE_BIT_AND).
  • Последняя часть —– <десятичное значение> — должна быть равна 16, чтобы найти свойства, которые копируются вместе с аккаунтом пользователя.

Получается следующая строка:


Get-ADObject -SearchBase $((Get-ADRootDSE).schemaNamingContext) -LDAPFilter "(&(objectClass=attributeSchema)(searchFlags:1.2.840.113556.1.4.803:=16))"

В результате мы получим DistinguishedName, Name ObjectClass и ObjectGUID атрибутов, которые копируются вместе с объектом пользователя.


Так как от этих атрибутов нужны только имена (Name), добавим к команде | %{$_.Name}.


Get-ADObject -SearchBase $((Get-ADRootDSE).schemaNamingContext) -LDAPFilter "(&(objectClass=attributeSchema)(searchFlags:1.2.840.113556.1.4.803:=16))" | %{$_.Name}


Теперь PowerShell возвращает только имена.


Если вы хотите получить атрибуты, которые не будут скопированы при дублировании объекта, замените (searchFlags:1.2.840.113556.1.4.803:=16) на (!(searchFlags:1.2.840.113556.1.4.803:=16)):


Get-ADObject -SearchBase $((Get-ADRootDSE).schemaNamingContext) -LDAPFilter "(&((objectClass=attributeSchema)(!(searchFlags:1.2.840.113556.1.4.803:=16))))" | %{$_.Name}

Что еще можно почитать на волне вдохновения PowerShell:


Комментарии (4)


  1. brainfair
    12.04.2018 04:24

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


    1. scruff
      12.04.2018 12:56

      Люди, которые так делают, смотрят на этот процесс, как на возможность автоматизировать рутинную работу и уменьшить влияние человеческого фактора при создании учётки «с нуля». Глюки, которые выползают потом, с точки зрения таких людей — вопрос второстепенный.


  1. scruff
    12.04.2018 12:58

    … не забудьте удалить свой аккаунт из этой группы, когда закончите с настройками… Зачем? Ведь с точки зрения безопасности это «холостой ход» — движение есть — эффекта нет. Любой домен-админ может рулить этими полномочиями «как взад, так и вперед».


    1. dimskiy
      13.04.2018 11:18

      Полагаю, это нечто вроде защиты от «выстрела в ногу». Ну вдруг в понедельник утром не тот скрипт запустите и расширите схему не в ту сторону :)