Los objetos persistentes pueden permanecer después de volver a poner en línea un servidor de catálogo global obsoleto

En este artículo se describen los procedimientos para limpiar objetos que se vuelven a introducir en AD después de volver a poner en línea un controlador de dominio sin conexión.

Se aplica a: Windows Server 2019, Windows Server 2016, Windows Server 2012 R2
Número de KB original: 314282

Síntomas

Pone en línea un controlador de dominio (DC) o un servidor de catálogo global después de que haya estado sin conexión durante mucho tiempo. Después de que se conecte, observará uno o varios de los siguientes problemas:

  • Los mensajes de correo electrónico no se entregan a un usuario cuyo objeto de usuario se movió entre dominios. Después de volver a poner en línea el controlador de dominio obsoleto o el servidor de catálogo global, ambas instancias del objeto de usuario aparecen en el catálogo global. Ambos objetos tienen la misma dirección de correo electrónico, por lo que no se pueden entregar mensajes de correo electrónico.
  • Todavía aparece una cuenta de usuario que ya no existe en la lista global de direcciones.
  • Todavía aparece un grupo universal que ya no existe en el token de acceso de un usuario.
  • Otros controladores de dominio o servidores de catálogo global registran eventos como EventID 1084, No hay ningún objeto de este tipo en el servidor. Se bloquea la replicación adicional en los controladores de dominio o servidores de catálogo global afectados.

Causa

Estos problemas pueden producirse si el controlador de dominio o el servidor de catálogo global han estado sin conexión durante más tiempo que el valor del atributo Tombstone-Lifetime de los objetos de usuario.

Para obtener más información sobre el atributo Tombstone-Lifetime , consulte Atributo Tombstone-Lifetime.

El atributo Tombstone-Lifetime define el número de días antes de que se quite un objeto eliminado de los servicios de directorio. Esto ayuda a quitar objetos de servidores replicados e impedir que las restauraciones vuelvan a introducir un objeto eliminado. El valor predeterminado es 180 días. Después de ese tiempo, Active Directory ya no necesita recordar el cambio.

Si un controlador de dominio o un servidor de catálogo global están sin conexión durante más tiempo que el valor del atributo Tombstone-Lifetime , su copia de Active Directory (o el catálogo global) puede contener objetos que se han eliminado en los demás controladores de dominio. Sin embargo, los demás controladores de dominio ya no recuerdan que se han eliminado los objetos. Al poner en línea el controlador de dominio sin conexión, sincroniza su copia de Active Directory con el resto del dominio. Dado que se ha descartado la información sobre las eliminaciones, el controlador de dominio replica los objetos afectados (a los que se hace referencia como objetos persistentes) al resto del dominio.

En general, AD DS usa un modelo de replicación de coherencia flexible, en el que algunos contextos de nomenclatura (también conocidos como particiones de directorio) son de lectura y escritura y otros son de solo lectura. Cuando un controlador de dominio que recibe un objeto replicado que pertenece a un contexto de nomenclatura de lectura y escritura y ese objeto aún no existe en la copia local del árbol de información de directorio (DIT), el controlador de dominio crea el objeto. A medida que continúa el proceso de replicación, el objeto vuelve a aparecer en todos los controladores de dominio del dominio.

Los controladores de dominio y los servidores de catálogo global también pueden usar un modelo de coherencia de replicación estricto. En este modelo, cuando el controlador de dominio recibe un objeto replicado que aún no existe en el DIT local, el controlador de dominio deja de recibir o enviar eventos de datos y registros replicados, como el identificador de evento 1084, "No hay ningún objeto en el servidor". Para obtener más información sobre la coherencia estricta de la replicación, incluidas las circunstancias en las que los controladores de dominio pueden usar este modelo de forma predeterminada, vea KB 910205, Information about lingering objects in a Windows Server Active Directory forest. Para obtener más información acerca de los problemas de lápiz, consulte KB216993 útil vida útil de una copia de seguridad de estado del sistema de Active Directory.

Resolución 1: Determinar si Active Directory tiene objetos persistentes y evitar futuros objetos persistentes

KB 910205, explica varias maneras de determinar si el sistema de Active Directory ha acumulado objetos persistentes. KB 910205 también describe los pasos que puede seguir para evitar que se acumule objetos persistentes.

Resolución 2: Eliminación de objetos persistentes

Si el objeto no debe existir en Active Directory en absoluto (por ejemplo, si un controlador de dominio obsoleto ha vuelto a introducir el objeto), puede eliminar los objetos con las herramientas estándar (como ADSIEdit o el complemento Usuarios y equipos de Active Directory).

Es fácil quitar objetos persistentes para contextos de nomenclatura de lectura y escritura. En Windows Server 2003 y versiones posteriores, puede quitar objetos persistentes mediante el comando repadmin /removelingeringobjects. Para obtener información sobre cómo usar RepAdmin, vea Id. de evento de replicación de Active Directory 1388 o 1988: Se detecta un objeto persistente.

En este artículo se describe cómo quitar objetos persistentes que ya han aparecido en contextos de nomenclatura de solo lectura, como particiones de directorio en servidores de catálogo global o controladores de dominio de Read-Only (RODC). La funcionalidad que se describe en la sección Más información sigue existiendo en sistemas operativos más recientes y puede ser útil para solucionar problemas de comportamiento inesperado de RepAdmin.

Más información

Este procedimiento requiere el objectGUID de un controlador de dominio que tiene una copia de lectura y escritura del objeto y el objectGUID del propio objeto. Si debe quitar más de un objeto, determine si alguno de los objetos está en una relación primaria/secundaria (puede determinarlo a partir de los nombres distintivos de los objetos). Si este es el caso, ordene las eliminaciones para que todos los objetos secundarios se eliminen antes que sus objetos primarios.

Este procedimiento tiene tres pasos principales, que tiene que realizar en un equipo que tiene acceso al bosque (y tiene que usar una cuenta de usuario que tenga permisos administrativos en el bosque):

  1. Obtenga el nombre distintivo y ObjectGUID del objeto persistente.
  2. Identifique un controlador de dominio en el dominio de objeto.
  3. Elimine los objetos persistentes. Seleccione uno de los métodos siguientes:
    • Elimine algunos objetos persistentes.
    • Elimine un gran número de objetos persistentes.

Importante

Cada servidor de catálogo global en el que quiera ejecutar las operaciones de eliminación (paso 3) debe tener conectividad de red con el controlador de dominio que haya identificado (paso 2).

Para obtener información sobre la solución de problemas, consulte las secciones siguientes:

  • Mensaje de error al ejecutar Walkservers.cmd para modificar muchos objetos persistentes en el entorno.
  • Mensaje de error 87 al quitar objetos persistentes en el entorno.

Obtener el nombre distintivo y ObjectGUID del objeto persistente

La mejor manera de identificar el dominio en el que se encuentra un objeto (y a partir de eso para determinar el nombre de un controlador de dominio que tiene una copia de lectura y escritura del objeto) es recuperar el nombre distintivo del objeto. Puede buscar el nombre (o partes del nombre) del objeto mediante la herramienta Ldp.exe. Para ello, siga estos pasos:

  1. Inicie Ldp.exe.

    En la mayoría de las versiones de Windows, seleccione Iniciar>ejecución y escriba ldp.exe. En versiones anteriores de Windows (como Windows Server 2003 SP1), esta herramienta está disponible como una de las herramientas de soporte técnico.

  2. Seleccione Conexión>Conectar. En el cuadro Servidor , escriba el nombre de un servidor de catálogo global. En el cuadro Puerto , escriba 3268 y, a continuación, seleccione Aceptar.

  3. Seleccione Enlace de conexión>. Escriba credenciales válidas si las credenciales actuales no son suficientes para consultar todo el contenido del catálogo global. Seleccione Aceptar.

  4. Seleccione Ver>árbol. Escriba el nombre distintivo de la raíz del bosque y, a continuación, seleccione Aceptar.

  5. En la lista de árboles, haga clic con el botón derecho en la raíz del bosque y, a continuación, seleccione Buscar.

  6. En el cuadro Filtro , escriba un filtro que use el <formato de atributo> = <valor> .

    En el texto del filtro, <el atributo> representa el atributo de objeto que se va a buscar y <el valor> representa los criterios para los que se está buscando. Puede usar ***** como carácter comodín en el valor y puede usar una expresión.

    Para obtener información sobre la sintaxis de filtro ldap (Protocolo ligero de acceso a directorios), consulte Sintaxis de filtro de búsqueda.

    Por ejemplo, para buscar objetos para los que el atributo sAMAccountName tiene un valor de testuser, escriba (sAMAccountName = testuser) en el cuadro Filtro . Para buscar un objeto de usuario, los atributos siguientes son más útiles:

    • cn
    • userPrincipalName
    • Samaccountname
    • name
    • Correo
    • sn

    Para buscar un objeto de grupo, los atributos siguientes son más útiles:

    • cn
    • Samaccountname
    • name
  7. En Ámbito, seleccione Subárbol.

  8. Seleccione el cuadro Atributos y, a continuación, seleccione el final de la cadena de atributo. Escriba ; objectGUID al final de la cadena.

    Captura de pantalla de la ventana Buscar con el tipo ;objectGUID al final de la cadena en el cuadro Atributo.

    En algunas versiones de Ldp, debe seleccionar Opciones para ver el cuadro Atributos .

  9. Para ejecutar la consulta, seleccione Ejecutar.

    Los resultados aparecen en la ventana principal de Ldp.

  10. Determine cuál, si existe, de los objetos que aparecen en los resultados debe quitarse del catálogo global. Una indicación de que ha encontrado un objeto incorrecto es que el objeto no existe en una copia de lectura y escritura del contexto de nomenclatura.

  11. Si los objetos que está buscando no se incluyen en los resultados de la consulta, vuelva a modificar el filtro y vuelva a ejecutar la búsqueda.

  12. Si ha identificado un objeto persistente, tenga en cuenta los valores de sus atributos DN y objectGUID . Necesitará esos valores más adelante.

Identificación de un controlador de dominio en el dominio de objeto

El valor del atributo DN del objeto incluye el dominio del objeto. Cuando conozca el dominio, puede identificar un controlador de dominio o un servidor de catálogo global dentro del dominio. Para ello, siga estos pasos.

  1. Compruebe las partes dc= del valor DN . Combine las partes dc= para obtener el nombre de dominio.

    Por ejemplo, si un objeto tiene el valor DN de cn=FirstName LastName,cn=Users,dc=name1,dc=name2,dc=com, el objeto está en el name1.name2.com dominio.

  2. Para buscar un controlador de dominio (o un servidor de catálogo global) en este dominio, abra Usuarios y equipos de Active Directory, abra el contenedor de dominio y, a continuación, abra el contenedor Controladores de dominio.

  3. Abra una ventana del símbolo del sistema con privilegios elevados y escriba repadmin /showreps dc-name.

    Nota:

    En este comando, dc-name representa el nombre del equipo del controlador de dominio que identificó en el paso 2.

    En versiones anteriores de Windows (como Windows Server 2003 SP1), RepAdmin está disponible como una de las herramientas de soporte técnico.

    Repadmin genera resultados similares a los siguientes:

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

  4. Observe el valor del GUID del objeto DSA. Este es el valor objectGUID del controlador de dominio.

Eliminación de objetos persistentes

Use los métodos siguientes para eliminar objetos persistentes.

Eliminar algunos objetos persistentes de algunos servidores de catálogo global

Si solo tiene algunos objetos y catálogos globales, siga estos pasos para eliminar los objetos mediante Ldp.exe:

  1. Use las credenciales de administrador de empresa para iniciar sesión en cada servidor de catálogo global que contenga una copia del objeto persistente.

  2. Inicie Ldp.exe y conéctese al puerto 389 en el controlador de dominio local (deje el cuadro Servidor vacío).

  3. Seleccione Enlace de conexión>. Deje todos los cuadros vacíos (ya ha iniciado sesión como administrador de empresa).

  4. Seleccione Examinar>Modificar.

    Captura de pantalla de la ventana Modificar con algunas entradas que se pueden configurar.

  5. Configure las siguientes entradas en el cuadro de diálogo Modificar :

    1. Deje el cuadro Dn vacío.

    2. En el cuadro Atributo , escriba RemoveLingeringObject.

    3. En el cuadro Valores , escriba un valor que use el formato siguiente:

      <GUID=dcGUID>: <GUID=objectGUID>

      En este valor, dcGUID representa el GUID del controlador de dominio que identificó en el paso 2 de esta sección y objectGUID representa el GUID del objeto persistente que identificó en el paso 1 de esta sección.

      El valor debe ser similar al siguiente:

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

      Importante

      En el valor, no omita los espacios antes y después de los dos puntos.

    4. SeleccioneOperation Replace (Reemplazaroperación>) y, a continuación, seleccione Entrar.

      El cuadro Lista de entradas muestra el comando completo.

    5. Seleccione Ejecutar.

      Los resultados aparecen en la ventana Ldp principal y deben ser similares a los siguientes.

      Llamar a Modificar... ldap_modify_s(ld, '(null)',[1] attrs); Modificado "".

Eliminar un gran número de objetos persistentes de varios servidores de catálogo global

Si tiene que eliminar un gran número de objetos persistentes, puede eliminarlos de forma más eficaz mediante scripts que eliminándolos manualmente. Para compilar estos scripts, siga estos pasos:

  1. Cree una nueva carpeta y, en esa carpeta, cree nuevos archivos que tengan los nombres siguientes:

    • Walkservers.cmd
    • Walkobjects.cmd
    • Modifyrootdse.vbs
    • Server-list.txt
    • archivo Object-list.txt
  2. Pegue el texto siguiente en Walkservers.cmd:

    for /f %%j in (server-list.txt) do walkobjects %%j
    
  3. Pegue el texto siguiente en Walkobjects.cmd:

    for /f "delims=@" %%i in (object-list.txt) do cscript //NoLogo MODIFYROOTDSE.VBS %1 "%%i" >>update-%1.log
    
  4. Pegue el texto siguiente en 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
    

    Nota:

    Si inicia Modifyrootdse.vbs manualmente, asegúrese de incluir entre comillas los parámetros que contengan espacios.

  5. Cree una lista de todos los nombres de dominio completos de los servidores de catálogo global y controladores de dominio que contienen los objetos persistentes y, a continuación, pegue la lista en Server-list.txt. Use los nombres de dominio completos para evitar búsquedas de sufijos DNS.

  6. Para cada objeto persistente, identifique un controlador de dominio en el dominio de objeto que no tenga una copia del objeto persistente. Normalmente se trata de un controlador de dominio que tiene un contexto de nomenclatura de lectura y escritura en el que se elimina manualmente el objeto persistente. Como se describe en otra parte de este artículo, use RepAdmin para obtener el valor objectGUID de cada controlador de dominio.

  7. En Object-list.txt, cree una lista de pares GUID con el formato siguiente:

    <GUID=dcGUID>: <GUID=objectGUID>

    Nota:

    En este valor, dcGUID representa el GUID del controlador de dominio que no tiene una copia del objeto persistente y objectGUID representa el GUID del objeto persistente.

    Cada par debe ser similar al siguiente:

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

    Importante

    En el valor, no omita los espacios antes y después de los dos puntos.

  8. Ejecute el archivo Walk-servers.cmd.

Para cada controlador de dominio o servidor de catálogo global que aparece en Server-list.txt, los scripts generan un archivo de registro denominado Update-server-name.log. Cada archivo de registro contiene una línea para cada objeto que se va a eliminar.

Dado que es posible que los objetos persistentes no existan en todos los servidores enumerados, los errores en los archivos de registro no indican necesariamente un problema. Sin embargo, los mensajes de error de la operación de formulario denegada o el error de operación indican que hay un problema con los GUID o con la sintaxis del valor. Si se producen estos errores, compruebe lo siguiente:

  • Asegúrese de que los GUID de controlador de dominio son los GUID correctos para los controladores de dominio que contienen un contexto de nomenclatura de lectura y escritura del dominio que contiene el objeto.

  • Asegúrese de que los GUID de objeto identifican objetos persistentes en contextos de nomenclatura de solo lectura (servidores de catálogo global o RODC).

Error al ejecutar Walkservers.cmd para modificar muchos objetos persistentes en el entorno

GUID del objeto <=<GUID>> : <NO se pudo quitar GUID=<GUID>> . El número de error es: -2147016672. La descripción del error es: .

Causa de este error

Este error se produce cuando el script se ejecuta con el GUID de un controlador de dominio que no contiene un contexto de nomenclatura de lectura y escritura que corresponde al contexto de nomenclatura que contiene el objeto persistente. Compruebe la ubicación del objeto persistente mediante la herramienta Ldp.exe.

Ejemplo

En el ejemplo siguiente, el objeto persistente que se va a quitar se encuentra en el dominio corp.company.local. Sin embargo, la <entrada GUID=<GUID>> del archivo Objects-list.txt está asociada a un controlador de dominio que reside en el dominio company.local. Este controlador de dominio no tiene un contexto de nomenclatura de lectura y escritura para el dominio corp.company.local.

La siguiente búsqueda genera varios objetos que representan al mismo usuario (Joe) y enumera sus valores objectGUID .

ldap_search_s(ld, "DC=company,DC=local", 2, "(cn=User*)", attrList, 0, &msg) Resultado <0>: (null)
DN coincidentes:
Obtención de 4 entradas:
>> 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: Usuario, Joe; 1> descripción: CEO;
1> displayName: User, Joe; 1> distinguishedName: CN=User, Joe,OU=Exec,OU=Corporate Users,DC=corp,DC=company,DC=local; 4> objectClass: top; person; organizationalPerson; user;
1> objectGUID: <GUID>; 1> nombre: Usuario, Joe;
>> Dn: CN=User, Joe,OU=Migration,DC=corp,DC=company,DC=local 1> canonicalName: corp.company.local/Migration/User, Joe;
1> cn: Usuario, Joe;
1> descripción: Cuenta deshabilitada; 1> displayName: User, Joe; 1> distinguishedName: CN=User, Joe,OU=Migration,DC=corp,DC=company,DC=local;
4> objectClass: top; person; organizationalPerson; user;
1> objectGUID: <GUID>;
1> nombre: Usuario, Joe;

En este ejemplo, se supone que hay un controlador de dominio en el dominio corp.company.local denominado CORP-DC-01. La ejecución del comando repadmin /showreps CORP-DC-01 genera el GUID> del valor<objectGUID. Este GUID reemplaza el GUID anterior en el archivo Objects-list.txt. La entrada de este objeto persistente ahora aparece como sigue:

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

El primer GUID es el GUID del controlador de dominio en el dominio corp.company.local. El segundo GUID es el GUID del objeto persistente. Después de este cambio, el script de Walk-servers.cmd se ejecuta correctamente.

Mensaje de error 87 al quitar objetos persistentes en el entorno

Este error puede producirse cuando se encuentran objetos que, de hecho, no aparecen en todos los controladores de dominio que hospedan el contexto de nomenclatura, pero repadmin /removelingeringobjects no los quita. Esto puede ser una situación cuando un controlador de dominio del centro replica nuevos objetos que creó con servidores de catálogo global, pero no con controladores de dominio de réplica de lectura y escritura en su propio dominio.

Este error solo se devuelve en dos casos:

  • El objeto existe en el controlador de dominio de referencia.
  • El objeto es demasiado joven (en comparación con el valor de TSL actual) para permanecer.

Para ver un ejemplo del segundo caso, considere la posibilidad de un servidor de catálogo global que tenga los metadatos siguientes:

Atributo Loc.USN Origining DC Org.USN Org.Time/Date Ver
======= =============== ========= ============= === =========
143543261 d20f71f3-6147-4f80-a0c2-470541ef09e6 104742409 <DateTime> objectClass
Vector actualizado de una réplica RW: d20f71f3-6147-4f80-a0c2-470541ef09e6 @ USN 104583382 @ Time <DateTime>
Vector actualizado de un GC: d20f71f3-6147-4f80-a0c2-470541ef09e6 @ USN 104762881 @ Time <DateTime>

En este caso, el controlador de dominio creó el objeto después de que se produjese un error en la replicación con los controladores de dominio de su propio dominio, pero todavía se replicaba con servidores de catálogo global en otros dominios.

Para resolver este problema, deje que estos objetos se conviertan en objetos persistentes reales (antiguos más allá de TSL) y, a continuación, quítelos mediante el script de este artículo. Para asegurarse de que los datos continúan repliquendo, establezca Permitir replicación con asociados divergentes y dañados en todos los controladores de dominio del bosque.

Si no puede resolver los errores en los archivos de registro mediante estos métodos, es posible que esté experimentando un problema diferente. Póngase en contacto con los Servicios de soporte técnico de Microsoft para obtener ayuda adicional.

Recolección de datos

Si necesita ayuda del soporte técnico de Microsoft, le recomendamos que recopile la información siguiendo los pasos mencionados en Recopilación de información mediante TSS para problemas de replicación de Active Directory.