Задерживающиеся объекты могут остаться после возврата устаревшего сервера глобального каталога в режим "в сети"

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

Применимо к: Windows Server 2019, Windows Server 2016, Windows Server 2012 R2
Исходный номер базы знаний: 314282

Симптомы

Вы переводите контроллер домена (DC) или сервер глобального каталога в режим "в сети" после того, как он находится в автономном режиме в течение длительного времени. После подключения к сети вы обнаследуете одну или несколько из следующих проблем:

  • Сообщения электронной почты не доставляются пользователю, чей объект пользователя был перемещен между доменами. После возврата устаревшего сервера контроллера домена или глобального каталога оба экземпляра объекта пользователя отображаются в глобальном каталоге. Оба объекта имеют один и тот же адрес электронной почты, поэтому сообщения электронной почты не могут быть доставлены.
  • Учетная запись пользователя, которая больше не существует, по-прежнему отображается в глобальном списке адресов.
  • Универсальная группа, которая больше не существует, по-прежнему отображается в маркере доступа пользователя.
  • Другие контроллеры домена или серверы глобального каталога регистрируют события, такие как EventID 1084. На сервере нет такого объекта. Дальнейшая репликация блокируется на затронутых контроллерах домена или серверах глобального каталога.

Причина

Эти проблемы могут возникать, если контроллер домена или сервер глобального каталога находится в автономном режиме дольше, чем значение атрибута Tombstone-Lifetime объектов пользователя.

Дополнительные сведения об атрибуте Tombstone-Lifetime см. в разделе Атрибут Tombstone-Lifetime.

Атрибут Tombstone-Lifetime определяет количество дней, в течение которых удаленный объект будет удален из служб каталогов. Это помогает удалить объекты с реплицированных серверов и предотвратить повторное введение удаленного объекта при восстановлении. Значение по умолчанию составляет 180 дней. По истечении этого времени Active Directory больше не нужно запоминать изменения.

Если контроллер домена или сервер глобального каталога находится в автономном режиме дольше, чем значение атрибута Tombstone-Lifetime , его копия Active Directory (или глобальный каталог) может содержать объекты, которые были удалены на других контроллерах домена. Однако другие контроллеры домена больше не помнят, что объекты были удалены. При переносе автономного контроллера домена в режим "в сети" он синхронизирует свою копию Active Directory с остальной частью домена. Так как сведения об удалениях были удалены, контроллер домена реплицирует затронутые объекты (называемые затяжными объектами) обратно в остальную часть домена.

Как правило, AD DS использует модель репликации с свободной согласованность, в которой некоторые контексты именования (также называемые разделами каталогов) считываются и записываются, а другие — только для чтения. Если контроллер домена, получающий реплицированный объект, принадлежащий контексту именования для чтения и записи, и этот объект еще не существует в локальной копии дерева сведений о каталоге (DIT), контроллер домена создает объект . По мере продолжения процесса репликации объект снова появляется на всех контроллерах домена в домене.

Контроллеры домена и серверы глобального каталога также могут использовать строгую модель согласованности репликации. В этой модели, когда контроллер домена получает реплицированный объект, который еще не существует в локальном DIT, контроллер домена перестает получать или отправлять реплицированные данные и регистрирует события, такие как Event ID 1084, "На сервере нет такого объекта". Дополнительные сведения о строгой согласованности репликации, включая обстоятельства, при которых контроллеры домена могут использовать эту модель по умолчанию, см. в статье Базы знаний 910205, Сведения о затяжных объектах в лесу Windows Server Active Directory. Дополнительные сведения о проблемах с надгробными камнями см . в разделе KB216993 Срок полезного хранения резервной копии состояния системы Active Directory.

Решение 1. Определите, есть ли в Active Directory задерживающиеся объекты, и избегайте будущих затяжных объектов

Kb 910205, объясняет несколько способов, с помощью которых можно определить, накапливаются ли в системе Active Directory затяжные объекты. Kb 910205 также описывает шаги, которые можно предпринять, чтобы предотвратить накопление затяжных объектов.

Решение 2. Удаление затяжных объектов

Если объект вообще не должен существовать в Active Directory (например, если объект был повторно введен устаревшим контроллером домена), можно удалить объекты с помощью стандартных средств (таких как ADSIEdit или оснастка Пользователи и компьютеры Active Directory).

Для контекстов именования чтения и записи легко удалить затяжные объекты. В Windows Server 2003 и более поздних версиях можно удалить задержившиеся объекты с помощью команды repadmin /removelingeringobjects. Сведения об использовании RepAdmin см. в статье Событие репликации Active Directory с идентификатором 1388 или 1988: обнаружен затяжной объект.

В этой статье описывается удаление затяжных объектов, которые уже появились в контекстах именования только для чтения, таких как разделы каталогов на серверах глобального каталога или контроллеры домена Read-Only (RODC). Функциональные возможности, рассмотренные в разделе Дополнительные сведения , по-прежнему существуют в новых операционных системах и могут по-прежнему быть полезны для устранения неполадок с непредвиденным поведением RepAdmin.

Дополнительная информация

Для этой процедуры требуется objectGUID контроллера домена, который имеет копию объекта для чтения и записи, и objectGUID самого объекта. Если необходимо удалить несколько объектов, определите, находятся ли какие-либо объекты в отношениях "родители-потомки" (это можно определить по различающиеся имена объектов). В этом случае упорядочение удаления, чтобы все дочерние объекты были удалены до их родительских объектов.

Эта процедура состоит из трех основных шагов, которые необходимо выполнить на компьютере с доступом к лесу (и необходимо использовать учетную запись пользователя с административными разрешениями в лесу):

  1. Получите различающееся имя и ObjectGUID затяжного объекта.
  2. Определите контроллер домена в объектном домене.
  3. Удалите затяжные объекты. Выберите один из следующих методов:
    • Удалите несколько затяжных объектов.
    • Удалите большое количество затяжных объектов.

Важно!

Каждый сервер глобального каталога, на котором планируется выполнить операции удаления (шаг 3), должен иметь сетевое подключение к контроллеру домена, который вы определили (шаг 2).

Сведения об устранении неполадок см. в следующих разделах:

  • Сообщение об ошибке при выполнении Walkservers.cmd для изменения многих затяжных объектов в среде.
  • Сообщение об ошибке 87 при удалении затяжных объектов в среде.

Получение различающегося имени и ObjectGUID затяжного объекта

Лучший способ определить домен, в котором находится объект (а от этого — определить имя контроллера домена, имеющего копию объекта для чтения и записи), — получить различающееся имя объекта. Вы можете найти имя (или части имени) объекта с помощью средства Ldp.exe. Для этого выполните следующие действия:

  1. Запустите Ldp.exe.

    В большинстве версий Windows выберите Запустить>запуск и введите ldp.exe. В более ранних версиях Windows (например, Windows Server 2003 с пакетом обновления 1 (SP1) это средство доступно в качестве одного из средств поддержки.

  2. Последовательно выберите Подключение>Подключиться. В поле Сервер введите имя сервера глобального каталога. В поле Порт введите 3268 и нажмите кнопку ОК.

  3. Выберите Привязка подключения>. Введите допустимые учетные данные, если текущих учетных данных недостаточно для запроса всего содержимого глобального каталога. Нажмите ОК.

  4. Выберите Вид>дерево. Введите различающееся имя корня леса и нажмите кнопку ОК.

  5. В списке деревьев щелкните правой кнопкой мыши корень леса и выберите Поиск.

  6. В поле Фильтр введите фильтр, который использует <атрибут> = <формат значения> .

    В тексте фильтра атрибут> представляет атрибут объекта для< поиска, а <значение> — критерии, по которым выполняется поиск. Вы можете использовать ***** в качестве подстановочного знака в значении, а также выражение.

    Сведения о синтаксисе фильтра LDAP см. в разделе Синтаксис фильтра поиска.

    Например, чтобы найти объекты, для которых атрибут sAMAccountName имеет значение testuser, введите (sAMAccountName = testuser) в поле Фильтр . Для поиска объекта пользователя наиболее полезны следующие атрибуты:

    • cn
    • userPrincipalName.
    • Samaccountname
    • name
    • mail
    • sn

    Для поиска объекта группы наиболее полезны следующие атрибуты:

    • cn
    • Samaccountname
    • name
  7. В разделе Область выберите Поддерев.

  8. Выберите поле Атрибуты , а затем выберите конец строки атрибута. Введите ; objectGUID в конце строки.

    Снимок экрана: окно поиска с типом objectGUID в конце строки в поле Атрибут.

    В некоторых версиях Ldp необходимо выбрать Параметры , чтобы увидеть поле Атрибуты .

  9. Чтобы выполнить запрос, выберите Выполнить.

    Результаты отображаются в окне main Ldp.

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

  11. Если объекты, которые вы ищете, не включены в результаты запроса, перефразировать фильтр и снова запустите поиск.

  12. Если вы определили затяжной объект, обратите внимание на значения его атрибутов DN и objectGUID . Эти значения потребуются позже.

Определение контроллера домена в объектном домене

Значение атрибута DN объекта включает домен объекта . Когда вы знаете домен, вы можете определить контроллер домена или сервер глобального каталога в домене. Для этого выполните указанные ниже действия.

  1. Проверьте части dc= значения DN . Объедините части dc= для получения доменного имени.

    Например, если объект имеет значение DNcn=FirstName LastName,cn=Users,dc=name1,dc=name2,dc=com, объект находится в домене name1.name2.com .

  2. Чтобы найти контроллер домена (или сервер глобального каталога) в этом домене, откройте Пользователи и компьютеры Active Directory, откройте контейнер домена, а затем откройте контейнер Контроллеры домена.

  3. Откройте окно командной строки с повышенными привилегиями и введите repadmin /showreps dc-name.

    Примечание.

    В этой команде dc-name представляет имя компьютера контроллера домена, определенного на шаге 2.

    В более ранних версиях Windows (например, Windows Server 2003 с пакетом обновления 1 (SP1) RepAdmin доступен в качестве одного из средств поддержки.

    Repadmin дает следующие результаты:

    Default-First-Site-Name\WS2016-DC-01 DSA Options: IS_GC Site Options: (none) DSA object GUID: <GUID> DSA invocationID: invocationID: <invocationID>

  4. Обратите внимание на значение GUID объекта DSA. Это значение objectGUID контроллера домена.

Удаление затяжных объектов

Используйте следующие методы для удаления затяжных объектов.

Удаление нескольких затяжных объектов с нескольких серверов глобального каталога

Если у вас всего несколько объектов и глобальных каталогов, выполните следующие действия, чтобы удалить объекты с помощью Ldp.exe:

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

  2. Запустите Ldp.exe и подключитесь к порту 389 на локальном контроллере домена (оставьте поле Сервер пустым).

  3. Выберите Привязка подключения>. Оставьте все поля пустыми (вы уже вошли в систему с правами администратора предприятия).

  4. Выберите Обзор>изменить.

    Снимок экрана: окно

  5. Настройте следующие записи в диалоговом окне Изменение :

    1. Оставьте поле Dn пустым.

    2. В поле Атрибут введите RemoveLingeringObject.

    3. В поле Значения введите значение в следующем формате:

      <GUID=dcGUID>: <GUID=objectGUID>

      В этом значении dcGUID представляет идентификатор GUID контроллера домена, который вы определили на шаге 2 этого раздела, а objectGUID — идентификатор GUID объекта, который вы определили на шаге 1 этого раздела.

      Значение должно выглядеть следующим образом:

      <GUID=<GUID>>: <GUID=<GUID>>

      Важно!

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

    4. Выберите Операция>замены, а затем нажмите клавишу ВВОД.

      В поле Список записей отображается полная команда.

    5. Нажмите Запустить.

      Результаты отображаются в окне main Ldp и должны выглядеть следующим образом.

      Вызов изменить... ldap_modify_s(ld, '(null)',[1] attrs); Изменено "".

Удаление большого количества затяжных объектов с нескольких серверов глобального каталога

Если вам нужно удалить большое количество затяжных объектов, можно удалить более эффективно с помощью скриптов, чем путем их удаления вручную. Чтобы создать такие скрипты, выполните следующие действия.

  1. Создайте папку и создайте в ней новые файлы со следующими именами:

    • Walkservers.cmd
    • Walkobjects.cmd
    • Modifyrootdse.vbs
    • Server-list.txt
    • файл Object-list.txt
  2. Вставьте следующий текст в Walkservers.cmd:

    for /f %%j in (server-list.txt) do walkobjects %%j
    
  3. Вставьте следующий текст в Walkobjects.cmd:

    for /f "delims=@" %%i in (object-list.txt) do cscript //NoLogo MODIFYROOTDSE.VBS %1 "%%i" >>update-%1.log
    
  4. Вставьте следующий текст в Modifyrootdse.vbs:

    '********************************************************************
    '*
    '* File: MODIFYROOTDSE.VBS
    '* Created: January 2002
    '* Version: 1.0
    '*
    '* Main Function: Writes Active Directory information to clean up
    '* objects as per: Q314282.
    '* Usage: Modifyrootdse.vbs <TargetServer> <GUID PAIR>
    '* Parameter are fed into the script using a pair of batch files.
    '*
    '* Copyright (C) 2002 Microsoft Corporation '*
    '********************************************************************
    OPTION EXPLICIT
    ON ERROR RESUME NEXT
    
    Dim objDomain
    Dim ObjValue, strServerName, adsLdapPath
    Dim i
    
    'Get the command-line arguments
    
    if Wscript.arguments.count <> 2 Then
        Print "Invalid Number of Parameters. Use with WalkServers.CMD and WalkObjects.CMD"
        WScript.quit
    End If
    
    strServerName = Wscript.arguments.item(0)
    ObjValue = Wscript.arguments.item(1)
    
    adsLdapPath = "LDAP://" & strServerName & "/RootDSE"
    
    Set objDomain = GetObject(adsLdapPath)
        If Err.Number <> 0 Then
        WScript.Echo "Error opening ROOTDSE. Error number is: " & Err.Number & ". Error description is: " & Err.Description & "."
        Set objDomain = Nothing
        WScript.quit
    End If
    
    objDomain.Put "RemoveLingeringObject", ObjValue
    objDomain.Setinfo
    
    If Err.Number = 0 Then
        WScript.Echo "Object " & ObjValue & " was removed."
    Else
        WScript.Echo "Object " & ObjValue & " could not be removed. Error number is: " & Err.Number & ". Error description is: " & Err.Description & "."
    End If
    
    WScript.Quit
    

    Примечание.

    Если вы начинаете Modifyrootdse.vbs вручную, обязательно заключите в кавычки все параметры, содержащие пробелы.

  5. Создайте список всех полных доменных имен серверов глобального каталога и контроллеров домена, содержащих затяжные объекты, а затем вставьте список в Server-list.txt. Используйте полные доменные имена, чтобы избежать поиска DNS-суффикса.

  6. Для каждого задерживающегося объекта определите контроллер домена в предметном домене, который не содержит копию задерживающегося объекта. Обычно это контроллер домена с контекстом именования для чтения и записи, в котором вы вручную удалили затяжной объект. Как описано в другом разделе этой статьи, используйте RepAdmin для получения значения objectGUID каждого контроллера домена.

  7. В Object-list.txt создайте список пар GUID в следующем формате:

    <GUID=dcGUID>: <GUID=objectGUID>

    Примечание.

    В этом значении dcGUID представляет ИДЕНТИФИКАТОР GUID контроллера домена, который не имеет копии затяжного объекта, а objectGUID представляет ИДЕНТИФИКАТОР GUID затяжного объекта.

    Каждая пара должна выглядеть следующим образом:

    <GUID=<GUID>>: <GUID=<GUID>>

    Важно!

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

  8. Запустите файл Walk-servers.cmd.

Для каждого сервера контроллера домена или глобального каталога, указанного в Server-list.txt, скрипты создают файл журнала с именем Update-server-name.log. Каждый файл журнала содержит строку для каждого удаляемого объекта.

Так как задерживающиеся объекты могут существовать не на всех перечисленных серверах, ошибки в файлах журнала не обязательно указывают на проблему. Однако сообщения об ошибках операции формы отказано или ошибка операции указывают на наличие проблемы с идентификаторами GUID или синтаксисом значения. Если возникают эти ошибки, проверьте следующее:

  • Убедитесь, что GUID контроллера домена являются правильными идентификаторами GUID для контроллеров домена, которые содержат контекст именования для чтения и записи домена, содержащего объект .

  • Убедитесь, что идентификаторы GUID объектов идентифицируют затяжные объекты в контекстах именования только для чтения (серверы глобального каталога или RODC).

Ошибка при выполнении Walkservers.cmd при изменении многих затяжных объектов в среде

Объект <GUID=<GUID>> : <GUID=<GUID>> не удалось удалить. Номер ошибки: -2147016672. Описание ошибки: .

Причина этой ошибки

Эта ошибка возникает, когда скрипт выполняется по идентификатору GUID контроллера домена, который не содержит контекст именования для чтения и записи, соответствующий контексту именования, содержашему затяжной объект. Проверьте расположение задерживающегося объекта с помощью средства Ldp.exe.

Пример

В следующем примере удаляемый объект находится в домене corp.company.local. <Однако запись GUID=<GUID>> в файле Objects-list.txt связана с контроллером домена, который находится в домене company.local. Этот контроллер домена не имеет контекста именования для чтения и записи для домена corp.company.local.

Следующий поиск создает несколько объектов, представляющих одного пользователя (Joe), и выводит их значения objectGUID .

ldap_search_s(ld, "DC=company,DC=local", 2, "(cn=User*)", attrList, 0, &msg) Result <0>: (null)
Совпадаете DN:
Получение 4 записей:
>> Dn: CN=User, Joe,OU=Exec,OU=Corporate Users,DC=corp,DC=company,DC=local
1> canonicalName: corp.company.local/Corporate Users/Exec/User, Joe;
1> cn: Пользователь, Джо; 1> описание: генеральный директор;
1> displayName: User, Joe; 1> различающееся имя: CN=User, Joe,OU=Exec,OU=Корпоративные пользователи,DC=corp,DC=company,DC=local; 4> objectClass: top; person; организационныйперсон; пользователь; пользователь;
1> objectGUID: <GUID>; 1> имя: User, Joe;
>> Dn: CN=User, Joe,OU=Migration,DC=corp,DC=company,DC=local 1> canonicalName: corp.company.local/Migration/User, Joe;
1> cn: User, Joe;
1> описание: отключенная учетная запись; 1> displayName: User, Joe; 1> различающееся имя: CN=User, Joe,OU=Migration,DC=corp,DC=company,DC=local;
4> objectClass: top; person; организационныйперсон; пользователь;
1> objectGUID: <GUID>;
1> имя: Пользователь, Джо;

В этом примере предположим, что в домене corp.company.local есть контроллер домена с именем CORP-DC-01. При выполнении команды repadmin /showreps CORP-DC-01 создается ИДЕНТИФИКАТОР GUID> значения<objectGUID. Этот GUID заменяет предыдущий GUID в файле Objects-list.txt. Запись для этого затяжного объекта теперь отображается следующим образом:

<GUID=<GUID>> : <GUID=<GUID>>

Первый GUID — это GUID контроллера домена в домене corp.company.local. Второй GUID — это GUID затяжного объекта. После этого изменения скрипт Walk-servers.cmd успешно выполняется.

Сообщение об ошибке 87 при удалении затяжных объектов в среде

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

Эта ошибка возвращается только в двух случаях:

  • Объект существует в эталонном контроллере домена.
  • Объект слишком молод (по сравнению с текущим значением TSL), чтобы задержиться.

В качестве примера второго случая рассмотрим сервер глобального каталога со следующими метаданными:

Атрибут Loc.USN, исходный DC Org.USN Org.Time/Date Ver
======= =============== ========= ============= === =========
143543261 d20f71f3-6147-4f80-a0c2-470541ef09e6 104742409 <DateTime> objectClass
Вектор актуальности RW-реплика: d20f71f3-6147-4f80-a0c2-470541ef09e6 @ USN 104583382 @ Time <DateTime>
Вектор актуальности сборки: d20f71f3-6147-4f80-a0c2-470541ef09e6 @ USN 104762881 @ Время <даты и времени>

В этом случае контроллер домена создал объект после репликации с контроллерами домена в собственном домене, но он по-прежнему реплицировался с серверами глобального каталога в других доменах.

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

Если вы не можете устранить ошибки в файлах журнала с помощью этих методов, может возникнуть другая проблема. Обратитесь в службу поддержки продуктов Майкрософт для получения дополнительной помощи.

Сбор данных

Если вам нужна помощь со стороны службы поддержки Майкрософт, рекомендуем собрать сведения, выполнив действия, описанные в разделе Сбор информации с помощью TSS для проблем с репликацией Active Directory.