Как отключить проверку дублей SPN в Active Directory

Обновлено 26.03.2021

Активный каталог

Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов рунета Pyatilistnik.org. В прошлый раз мы с вами разобрали "Как убрать поиск по вкладкам Google Chrome", двигаемся дальше и сегодня поговорим опять на тему активного каталога и домена Windows. В данной статье я вас научу отключать проверку дублей SPN в Active Directory, покажу варианты когда это можно использовать, так как сама Microsoft дала такую возможность.

Предпосылки для отключения проверки повторяющихся SPN

Не так давно я вам рассказывал об ошибке "Не удалось назначить SPN учетной записи" и там проблема была связана с тем, что в лесу был зарегистрирован SPN на другую учетную запись, что мешало новой регистрации, но это не единичные случаи, которые вы можете встретить в своем домене Active Directory. Простая ситуация у вас есть лес состоящий из нескольких доменов, на базе контроллера домена на Windows Server 2019, вы добавляете новый компьютер к домену, после подтверждения о присоединении у вас выскакивает ошибка:

При изменении имени узла DNS для объекта, значения имени участника-службы может не быть синхронизованы (changing the primary name of this computer to failed. While processing a chenge to the DNS Host Name for an object, the Service Principal Name values could not be kept in sync)

changing the primary name of this computer to failed

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

База данных защиты на сервере не имеет учетную запись компьютера для этого отношения доверия рабочей станции/kak-sbrosit-parol-uchetnoy-zapisi-kompyutera-i-vosstanovit-doverie-v-active-directory/

Как сбросить пароль учетной записи компьютера и восстановить доверие в Active directory-01

Или второй сценарий: Если выполнить миграцию пользователя внутри леса, имеющего имя участника службы (SPN) или основное имя пользователя (UPN) определеныt внутри леса, то миграция произойдет со сбоем, так как учетная запись продолжает существовать в глобальном каталоге как объект представленный в конечном домене, имеющий эти атрибуты заполнения. Если объект был сохранен в новом домене, повторяющееся имя участника-службы будет создано.

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

В любом из этих сценариев в логах Windows на контроллере домена вы будите видеть ошибку с кодом ID 2974, вот пример события которое я открыл через Windows Admin Center.

ID 2974 The attribute value provided is not unique in the forest or partition

И это нормальное поведение в рамках домена, так как любой дубль это не есть норма. В большинстве случаев вы всегда можете удалять дублирующие SPN или мешающие объекты при миграции в рамках леса, но все же могут быть сценарии в которых необходимо отключить проверку, об этом чуть ниже.

Метод отключения проверки дублей SPN

В Active Directory есть специальный атрибут dSHeuristics изменив в определенном месте его значение можно добиться нужного результата. dSHeuristics - это строковый атрибут Unicode. Каждый символ в строке представляет собой эвристику, которая используется для определения поведения Active Directory. К строке dSHeuristics применяются следующие ограничения:

  • Порядок символов в строке фиксирован; символы могут быть опущены только путем усечения строки.
  • По умолчанию атрибут dSHeuristics не существует, и, если не указано иное, значение по умолчанию для каждого символа в строке dSHeuristics равно "0".
  • При изменении существующей строки dSHeuristics значения всех существующих символов, которые не представляют интереса для модификации, должны быть сохранены.

Эти ограничения проиллюстрированы следующими примерами.

  1. Если dSHeuristics отсутствует или имеет нулевую длину, эвристика fSupFirstLastANR ложна.
  2. Если dSHeuristics состоит только из двух символов Unicode, то эвристика fDoListObject, которая будет представлена третьим символом в строке, будет ложной.
  3. Рассмотрим сценарий, в котором эвристики fSupFirstLastANR, fSupLastFirstANR и fDoNickRes требуются для определенного поведения системы. Строка dSHeuristics должна состоять как минимум из четырех символов, fSupFirstLastANR, fSupLastFirstANR, fDoListObject и fDoNickRes, даже если эвристика fDoListObject не нужна. Разработчик установит для символа fDoListObject значение по умолчанию "0", как описано ранее.
  4. Рассмотрим сценарий, в котором необходимо включить анонимные операции LDAP с Active Directory. В этом сценарии седьмой символ строки dSHeuristics, fLDAPBlockAnonOps, будет установлен на символ "2". Если строка dSHeuristics уже существовала до этой операции, никакие символы в строке dSHeuristics, кроме седьмого, не будут изменены. Если строка dSHeuristics еще не существовала до этой операции, с первого по шестой символы будут установлены значения по умолчанию, в результате чего в этом случае строка dSHeuristics будет "0000002".

Описание символов строки dSHeuristics

dSHeuristics состоит из 25 символов, ниже описание каждой цифры.

  1. fSupFirstLastANR - Если этот символ равен «0», то эвристика fSupFirstLastANR ложна; в противном случае эвристика fSupFirstLastANR верна.
  2. fSupLastFirstANR - Если этот символ равен «0», то эвристика fSupLastFirstANR ложна; в противном случае эвристика fSupLastFirstANR верна.
  3. fDoListObject - Если этот символ равен «1», то эвристика fDoListObject верна; в противном случае эвристика fDoListObject ложна.
  4. fDoNickRes - Если этот символ равен «0», то эвристика fDoNickRes ложна; в противном случае эвристика fDoNickRes верна. Эффект эвристики fDoNickRes выходит за рамки модели состояния. Если эвристика fDoNickRes истинна, запрос ANR через MAPI пытается найти точное совпадение с атрибутом псевдонима MAPI (атрибут с mAPIID, равным 0x3A00) перед выполнением поиска ANR
  5. fLDAPUsePermMod - Если этот символ равен «0», то эвристика fLDAPUsePermMod ложна; в противном случае эвристика fLDAPUsePermMod верна. Если эвристика fLDAPUsePermMod истинна, то все операции изменения LDAP ведут себя так, как если бы управление LDAP_SERVER_PERMISSIVE_MODIFY_OID было передано.
  6. ulHideDSID - Эвристика ulHideDSID приравнивается к числовому значению этого символа; то есть символ «0» равен 0, символ «1» равен 1 и так далее. Эвристика ulHideDSID контролирует, когда DSID возвращаются в расширенной строке ошибки LDAP, когда операция обнаруживает ошибку. Если эвристика равна 0, то DSID будут возвращаться всегда. Если эвристика равна 1, то DSID будут возвращены, если ошибка не является ошибкой имени, когда разные DSID могут выявить существование объекта, который не виден клиенту. Если эвристика отличается от 0 или 1, то DSID вообще не возвращаются. DSID состоит из строки «DSID-», за которой следует 32-битное целое число, зависящее от реализации, выраженное в шестнадцатеричном формате. Целое число определяет точку выполнения, в которой произошла ошибка.
  7. fLDAPBlockAnonOps - Если этот символ равен «2», то эвристика fLDAPBlockAnonOps ложна; в противном случае эвристика fLDAPBlockAnonOps верна. Если этого символа нет в строке, по умолчанию он принимает значение «2», когда функциональный уровень DC меньше DS_BEHAVIOR_WIN2003, и «0» в противном случае.
  8. fAllowAnonNSPI - Если этот символ равен «0», то эвристика fAllowAnonNSPI ложна; в противном случае эвристика fAllowAnonNSPI верна. Если эвристика fAllowAnonNSPI верна, разрешаются анонимные вызовы метода привязки RPC интерфейса поставщика службы имен (NSPI) . В противном случае разрешите только аутентифицированных клиентов.
  9. fUserPwdSupport - Если этот символ не равен ни «0», ни «2», то эвристика fUserPwdSupport верна. Если этот символ равен «2», то эвристика fUserPwdSupport ложна. Если этот символ равен «0», то эвристика fUserPwdSupport ложна для AD DS и истинна для AD LDS.
  10. десятый - При установке для dSHeuristics значения длиной 10 или более символов Unicode, если значение tenthChar не является символом «1», сервер отклоняет обновление.
  11. fSpecifyGUIDOnAdd - Если этот символ равен «0», то эвристика fSpecifyGUIDOnAdd ложна; в противном случае эвристика fSpecifyGUIDOnAdd верна. Эвристика fSpecifyGUIDOnAdd применяется только к AD DS. AD LDS всегда обрабатывает эту эвристику, как если бы символ был «0»; то есть, как если бы эвристика fSpecifyGUIDOnAdd была ложной.
  12. fDontStandardizeSDs - Если этот символ равен «0», то эвристика fDontStandardizeSDs ложна; в противном случае эвристика fDontStandardizeSDs верна.
  13. fAllowPasswordOperationsOverNonSecureConnection - Если этот символ равен «0», то эвристика fAllowPasswordOperationsOverNonSecureConnection ложна; в противном случае эвристика fAllowPasswordOperationsOverNonSecureConnection верна. Эвристика fAllowPasswordOperationsOverNonSecureConnection применяется только к AD LDS.
  14. fDontPropagateOnNoChangeUpdate - Если этот символ равен «0», то эвристика fDontPropagateOnNoChangeUpdate ложна; в противном случае эвристика fDontPropagateOnNoChangeUpdate верна. Если эвристика fDontPropagateOnNoChangeUpdate истинна, когда для атрибута nTSecurityDescriptor объекта установлено значение, побитовое идентичное текущему значению, рабочий элемент не ставится в очередь для задачи, которая обновляет дескрипторы безопасности дочерних элементов измененного объекта по порядку для распространения унаследованных ACE (раздел 6.1.3). Если эвристика fDontPropagateOnNoChangeUpdate имеет значение false, рабочий элемент всегда ставится в очередь при изменении атрибута nTSecurityDescriptor. Эвристика fDontPropagateOnNoChangeUpdate применяется к операционной системе Windows Server 2008 и более поздних версий. Операционная система Windows 2000 Server через версии операционной системы Windows Server 2003 R2 Active Directory ведет себя так, как если бы эвристика fDontPropagateOnNoChangeUpdate была ложной.
  15. fComputeANRStats - Если этот символ равен «0», то эвристика fComputeANRStats ложна; в противном случае эвристика fComputeANRStats верна. Эффект эвристики fComputeANRStats выходит за рамки модели состояния. Если эвристика fComputeANRStats истинна, поиск ANR оптимизируется с использованием оценок мощности, как и все другие поиски.
  16. dwAdminSDExMask - Допустимые значения для этого символа из набора «0» - «9» и «a» - «f». Эвристика dwAdminSDExMask соответствует символу, интерпретируемому как шестнадцатеричная цифра и преобразованному в 4-битное значение (то есть «1» = 0x1, «f» = 0xF).
  17. fKVNOEmuW2K - Если этот символ равен «0», то эвристика fKVNOEmuW2K ложна; в противном случае эвристика fKVNOEmuW2K верна.
  18. fLDAPBypassUpperBoundsOnLimits - Если этот символ равен «0», то эвристика fLDAPBypassUpperBoundsOnLimits ложна; в противном случае эвристика fLDAPBypassUpperBoundsOnLimits верна. Если эвристика fLDAPBypassUpperBoundsOnLimits ложна, контроллеры домена накладывают ограничения, зависящие от реализации, при интерпретации значений политик LDAP, указанных в разделе 3.1.1.3.4.6 . Если настроенное значение политики превышает предел, контроллер домена игнорирует значение политики и вместо этого использует ограничение, зависящее от реализации. Эта эвристика применима к Windows Server 2008 и более поздним версиям. Версии Active Directory от Windows 2000 Server до Windows Server 2003 R2 не накладывают таких ограничений.
  19. fDisableAutoIndexingOnSchemaUpdate - Если этот символ равен «0», то эвристика fDisableAutoIndexingOnSchemaUpdate ложна; в противном случае эвристика DisableAutoIndexingOnSchemaUpdate верна. Эффект эвристики fDisableAutoIndexingOnSchemaUpdate выходит за рамки модели состояния. Если эвристика fDisableAutoIndexingOnSchemaUpdate ложна, контроллеры домена могут инициировать создание индекса при обнаружении связанных с индексом изменений в атрибуте searchFlags (см. Раздел 2.2.10 ). Если эвристика fDisableAutoIndexingOnSchemaUpdate истинна, это подсказка для контроллеров домена, что создание индекса может быть отложено при обнаружении связанных с индексом изменений в атрибуте searchFlags до тех пор, пока администратор не выполнит операцию изменения schemaUpdateNow rootDSE , будет перезагружен контроллер домена или реализация - зависимый период времени истек. Эта эвристика применима к операционной системе Windows Server 2012 и более поздних версий. Операционная система Windows 2000 Server - Windows Server 2008 R2 не поддерживает эту эвристику.
  20. двадцатый - При установке для dSHeuristics значения длиной 20 или более символов Unicode, если значение twentiethChar не является символом «2», сервер отклоняет обновление.
  21. DoNotVerifyUPNAndOrSPNUniqueness - В AD LDS, если этот символ отличен от «0», AD LDS не будет проверять значения userPrincipalName на уникальность. В AD LDS эта эвристика применяется к операционной системе Windows Server 2003 и более поздних версий. В AD DS, если этот символ равен «1», «2» или «3», AD DS не будет проверять значения userPrincipalName или servicePrincipalName на уникальность. В AD DS эта эвристика применяется к операционной системе Windows Server 2012 R2 с [MSKB-3070083] и операционной системе Windows Server 2016 и более поздних версий.
  22. MinimumGetChangesRequestVersion (22-23) - Шестнадцатеричное значение в диапазоне от «00» до «FF». Это значение управляет минимальной версией структур DRS_MSG_GETCHGREQ *, которые DC будет отправлять или принимать. Если значение не установлено, используется значение «00». Когда значение равно «00», никакие ограничения не применяются.
  23. MinimumGetChangesReplyVersion (24-25) - Шестнадцатеричное значение в диапазоне от «00» до «FF». Это значение управляет минимальной версией структур DRS_MSG_GETCHGREPLY *, которые DC будет отправлять или принимать. Если значение не установлено, используется значение «00». Когда значение равно «00», никакие ограничения не применяются.

Подробнее по разделам на которые ссылается описание dSHeuristics  - https://docs.microsoft.com/ru-ru/openspecs/windows_protocols/ms-adts/e5899be4-862e-496f-9a38-33950617d2c5?redirectedfrom=MSDN

Проверка текущего значения dSHeuristics

Первое, что вы можете сделать это выполнить проверку текущего состояния проверки дублей SPN. Для этого откройте оснастку PowerShell и введите:

(get-adobject "CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=root,DC=pyatilistnik,DC=org" –Properties dsheuristics).dsheuristics

Если настройка не задана, то вы увидите пустой результат

Проверка текущего значения dSHeuristics

Управление значением dSHeuristics

  • Чтобы отключить проверку уникальности UPN, установите для 21-го символа dSHeuristics значение "1".

Set-adobject ‘CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=root,DC=pyatilistnik,DC=org’ –replace @{dsheuristics=’000000000100000000021‘}

Как отключить проверку уникальности UPN

  • Чтобы отключить проверку уникальности SPN, установите для 21-го символа dSHeuristics значение "2".

Set-adobject ‘CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=root,DC=pyatilistnik,DC=org’ –replace @{dsheuristics=’000000000100000000022‘}

Как отключить проверку уникальности SPN

  • Для отключения проверки уникальности UPN и SPN установите для 21-го символа dSHeuristics значение "3".

Set-adobject ‘CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=root,DC=pyatilistnik,DC=org’ –replace @{dsheuristics=’000000000100000000023‘}

отключение проверки уникальности UPN и SPN

  • Для возврата dSHeuristics к значению по умолчанию <не задано> выполните:

Set-adobject ‘CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=root,DC=pyatilistnik,DC=org’ –clear dsheuristics

Включение проверки дублей SPN

На этом у меня все, мы с вами рассмотрели управление механизмом слежения за дублями SPN и UPN в Active Directory. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

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

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

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