Es posible que los objetos persistentes permanezcan después de volver a poner en línea un servidor de catálogo global no actualizado

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

Versión original del producto:   Windows Server 2019, Windows Server 2016, Windows Server 2012 R2
Número KB original:   314282

Síntomas

Puede poner 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. Una vez conectado, se observan 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 dc 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 los mensajes de correo electrónico.
  • Una cuenta de usuario que ya no existe aún aparece en la lista global de direcciones.
  • Un grupo universal que ya no existe aún aparece en el token de acceso de un usuario.
  • Otros DCs o servidores de catálogo global registra eventos como EventID 1084, no hay ningún objeto de este tipo en el servidor. Se bloquean más replicaciones en los DCs o servidores de catálogo global afectados.

Causa

Estos problemas pueden producirse si el servidor de catálogo global o de DC ha 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 acerca del atributo Tombstone-Lifetime, vea el 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 repliquen 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 dc o un servidor de catálogo global está 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 otros DCs. Sin embargo, el resto de los DCs ya no recuerda que se han eliminado los objetos. Al poner el DC sin conexión en línea, sincroniza su copia de Active Directory con el resto del dominio. Dado que la información sobre las eliminaciones se ha descartado, dc replica los objetos afectados (denominados objetos persistentes) en el 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 DC que recibe un objeto replicado que pertenece a un contexto de nomenclatura de lectura y escritura y que ese objeto aún no existe en la copia local del árbol de información de directorio (DIT), el DC crea el objeto. A medida que el proceso de replicación continúa, el objeto vuelve a aparecer en todos los controladores de dominio del dominio.

Los DCs y los servidores de catálogo global también pueden usar un modelo estricto de coherencia de replicación. En este modelo, cuando el CONTROLADOR de dominio recibe un objeto replicado que aún no existe en el DIT local, el DC deja de recibir o enviar datos replicados y registra eventos como el identificador de evento 1084, "No hay ningún objeto de este tipo en el servidor". Para obtener más información acerca de la coherencia estricta de replicación, incluidas las circunstancias en las que los DCs pueden usar este modelo de forma predeterminada, vea KB 910205,Información sobre la coherencia de objetos en un bosque de Windows Server Active Directory. Para obtener más información acerca de los problemas de la lápida, vea KB216993Duración ú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 acumulen objetos persistentes.

Resolución 2: Eliminar objetos persistentes

Si el objeto no debe existir en Active Directory (por ejemplo, si un controlador de dominio obsoleto reintrodujo 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 acerca de 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 aparecieron 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 aún existe en sistemas operativos más recientes y puede seguir siendo útil para solucionar problemas de comportamiento inesperado de RepAdmin.

Más información

Este procedimiento requiere el objectGUID de un DC 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 principal/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 debe realizar en un equipo que tenga acceso al bosque (y debe usar una cuenta de usuario que tenga permisos administrativos en el bosque):

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

Importante

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

Para obtener información sobre la solución de problemas, vea 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 ese para determinar el nombre de un DC 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 búsqueda. Para ello, siga estos pasos:

  1. Inicie Ldp.exe.

    En la mayoría de las versiones de Windows, seleccione Iniciar > ejecución y escribaldp.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 Conectar > conexión. 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 árbol, haga clic con el botón secundario en la raíz del bosque y, a continuación, seleccione Buscar.

  6. En el cuadro Filtro, escriba un filtro que use el <attribute> = <value> formato.

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

    Para obtener información acerca de la sintaxis de filtro del Protocolo ligero de acceso a directorios (LDAP), vea 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
    • mail
    • 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.

    Cuadro de diálogo Búsqueda de LDP

    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 de Ldp principal.

  10. Determine cuáles, si los hay, de los objetos que aparecen en los resultados deben quitarse del catálogo global. Una indicación de que ha encontrado un objeto no adecuado 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 intentarlo y vuelva a ejecutar la búsqueda.

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

Identificar un DC en el dominio del objeto

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

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

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

  2. Para localizar un DC (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 de equipo del DC 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 produce 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. Tenga en cuenta el valor del GUID del objeto DSA. Este es el valor objectGUID del DC.

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

    Modificar objeto mediante LDP

  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 Remove PersistingObject.

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

      <GUID=dcGUID>: <GUID=objectGUID>

      En este valor, dcGUID representa el GUID del DC 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. Seleccione Operación > Reemplazar y, a continuación, escriba.

      El cuadro Lista de entradas muestra el comando completo.

    5. Seleccione Ejecutar.

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

      **_Call Modificar... ldap_modify_s(ld, '(null)',[1] attrs); Se modificó "".

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 crear estos scripts, siga estos pasos:

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

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

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

    for /f "delims=@" %%i in (object-list.txt) do cscript //NoLogo MODIFYROOTDSE.VBS %1 "%%i" >>update-%1.log
    
  4. Pegue el siguiente texto 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 empieza a Modifyrootdse.vbs manualmente, asegúrese de escribir 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 los 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 las búsquedas de sufijos DNS.

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

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

    <GUID=dcGUID>: <GUID=objectGUID>

    Nota

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

    Cada par debe parecerse a lo 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 servidor de catálogo global o dc que se muestra 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 rechazada o 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 DC 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

Objeto <GUID=<GUID> >: <GUID=<GUID>> no se pudo quitar. 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 DC que no contiene un contexto de nomenclatura de lectura y escritura que corresponda al contexto de nomenclatura que contiene el objeto persistente. Compruebe la ubicación del objeto persistente mediante la herramienta Ldp.exe datos.

Ejemplo

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

La siguiente búsqueda produce 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) Result <0>: (null)
DN coincidentes:
Obtener 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: User, 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; persona; organizationalPerson; usuario;
1> objectGUID: <GUID> ; 1> nombre: 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> descripción: Cuenta deshabilitada; 1> displayName: User, Joe; 1> distinguishedName: CN=User , Joe,OU=Migration,DC=corp,DC=company,DC=local;
4> objectClass: top; persona; organizationalPerson; usuario;
1> objectGUID: <GUID> ;
1> nombre: User, Joe;

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

<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 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 DCs que hospedan el contexto de nomenclatura, pero no repadmin /removelingeringobjects los quita. Esto puede ser una situación cuando un controlador de dominio de concentrador replica objetos nuevos que creó con servidores de catálogo global, pero no con los 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 DC de referencia.
  • El objeto es demasiado pequeño (en comparación con el valor actual de TSL) para ser persistente.

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

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

En este caso, el DC creó el objeto después de que la replicación con los controladores de dominio en su propio dominio empezara a dar error, pero aún se replicó con servidores de catálogo global en otros dominios.

Para resolver este problema, deje que estos objetos se conviertan en objetos persistentes (creados más allá de TSL) y, a continuación, quítelos mediante el script de este artículo. Para asegurarse de que los datos se siguen replicando, establezca Permitir replicación con asociados divergentes y dañados en todos los DCs 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.