Seguimiento de vínculos distribuidos en controladores de dominio basados en Windows

En este artículo se describe cómo puedes usar los servicios de seguimiento de vínculos distribuidos en Windows para realizar un seguimiento de la creación y el movimiento de archivos vinculados a través de volúmenes y servidores con formato NTFS.

Versión original del producto:   Windows Server 2012 R2
Número KB original:   312403

Puede usar el servicio del servidor de seguimiento de vínculos distribuidos y el servicio de cliente de seguimiento de vínculos distribuidos para realizar un seguimiento de los vínculos a archivos en particiones con formato NTFS. El seguimiento de vínculos distribuidos realiza un seguimiento de los vínculos en escenarios en los que el vínculo se realiza a un archivo en un volumen NTFS, como accesos directos de shell y vínculos OLE. Si se cambia el nombre de ese archivo, se mueve a otro volumen del mismo equipo, se mueve a otro equipo o se mueve en otros escenarios similares, Windows usa el seguimiento de vínculos distribuidos para encontrar el archivo. Cuando accede a un vínculo que se ha movido, el seguimiento de vínculos distribuidos localiza el vínculo; no sabe que el archivo se ha movido o que se usa el seguimiento de vínculos distribuidos para encontrar el archivo movido.

El seguimiento de vínculos distribuidos consta de un servicio de cliente y un servicio de servidor. El servicio del servidor de seguimiento de vínculos distribuidos se ejecuta exclusivamente en controladores de dominio basados en Windows Server. Almacena información en Active Directory y proporciona servicios para ayudar al servicio de cliente de seguimiento de vínculos distribuidos. El servicio de cliente de seguimiento de vínculos distribuidos se ejecuta en todos los equipos basados en Windows 2000 y en Microsoft Windows XP, incluidos aquellos en entornos de grupo de trabajo o aquellos que no están en un grupo de trabajo. Proporciona la única interacción con los servidores de seguimiento de vínculos distribuidos.

En ocasiones, los clientes de seguimiento de vínculos distribuidos proporcionan al servicio de servidor de seguimiento de vínculos distribuido información sobre vínculos de archivo, que el servicio de servidor de seguimiento de vínculos distribuidos almacena en Active Directory. Los clientes de seguimiento de vínculos distribuidos también pueden consultar el servicio del servidor de seguimiento de vínculos distribuidos para obtener esa información cuando no se puede resolver un acceso directo de shell o un vínculo OLE. Los clientes de seguimiento de vínculos distribuidos solicitan al servidor de seguimiento de vínculos distribuidos que actualice los vínculos cada 30 días. El servicio del servidor de seguimiento de vínculos distribuidos rastrea objetos que no se han actualizado en 90 días

Cuando un archivo al que hace referencia un vínculo se mueve a otro volumen (en el mismo equipo o en otro equipo), el cliente de seguimiento de vínculos distribuidos notifica al servidor de seguimiento de vínculos distribuidos, que crea un objeto linkTrackOMTEntry en Active Directory. Se crea un objeto linkTrackVolEntry en Active Directory para cada volumen NTFS del dominio.

Nota

En Windows Server 2008 y versiones posteriores, el servicio de servidor de seguimiento de vínculos distribuidos ya no se incluye en Windows. Por lo tanto, puede quitar los objetos de Active Directory de forma segura.

Los objetos de seguimiento de vínculos distribuidos se replican entre todos los controladores de dominio del dominio que hospedan la cuenta de equipo y todos los servidores de catálogo global del bosque. El servicio de servidor de seguimiento de vínculos distribuidos crea objetos en la siguiente ruta de acceso de nombre distintivo:

CN=FileLinks,CN=System,DC= contenedor de nombre de dominio de Active Directory

Los objetos de seguimiento de vínculos distribuidos existen en las dos tablas siguientes en la carpeta CN=FileLinks,CN=System:

  • CN=ObjectMoveTable,CN=FileLinks,CN=System,DC= domain name:

Este objeto almacena información acerca de los archivos vinculados que se han movido en el dominio.

  • CN=VolumeTable,CN=FileLinks,CN=System,DC= domain name:

    Este objeto almacena información sobre cada volumen NTFS del dominio.

Los objetos de seguimiento de vínculos distribuidos consumen poco espacio individualmente, pero pueden consumir grandes cantidades de espacio en Active Directory cuando se les permite acumular con el tiempo.

Si deshabilita el seguimiento de vínculos distribuidos y elimina los objetos de seguimiento de vínculos distribuidos de Active Directory, puede producirse el siguiente comportamiento:

  • El tamaño de la base de datos de Active Directory puede reducirse (este comportamiento se produce después de que los objetos se hayan desfragmentado y se hayan recopilado elementos no utilizados, y después de realizar un procedimiento de desfragmentación sin conexión).
  • El tráfico de replicación entre controladores de dominio puede reducirse.

En Windows 2000, Windows XP y Windows Server 2003, el valor de inicio del servicio de cliente de seguimiento de vínculos distribuidos se establece en Automático. En los servidores basados en Windows 2000, el servicio de servidor de seguimiento de vínculos distribuidos se inicia manualmente de forma predeterminada. Sin embargo, si usa Dcpromo.exe para promover un servidor a un dominio, el servicio de servidor de seguimiento de vínculos distribuidos está configurado para iniciarse automáticamente.

Para los servidores basados en Windows Server 2003, el servicio de servidor de seguimiento de vínculos distribuidos está deshabilitado de forma predeterminada. Cuando se usa Dcpromo.exe para promover un servidor a un dominio, el servicio de servidor de seguimiento de vínculos distribuidos no está configurado para iniciarse automáticamente. Cuando se actualiza un controlador de dominio basado en Windows 2000 a Windows Server 2003, el servicio de servidor de seguimiento de vínculos distribuidos también se deshabilita durante la actualización. Si es un administrador y desea usar el servicio del servidor de seguimiento de vínculos distribuidos, debe usar la directiva de grupo o debe configurar manualmente el servicio para que se inicie automáticamente. Además, el servicio de cliente de seguimiento de vínculos distribuidos en equipos que ejecutan Windows Server 2003 o Windows XP SP1 no intenta usar el servicio de servidor de seguimiento de vínculos distribuidos de forma predeterminada. Si desea configurar esos equipos para que aprovechen el servicio de servidor de seguimiento de vínculos distribuidos, habilite la opción Permitir que los clientes de seguimiento de vínculos distribuidos usen la configuración de directiva de recursos de dominio. Para ello, abra el nodo Configuración del equipo/Plantillas administrativas/Sistema en la directiva de grupo.

Microsoft recomienda usar la siguiente configuración con el seguimiento de vínculos distribuidos en servidores basados en Windows 2000:

  1. Desactive el servicio de servidor de seguimiento de vínculos distribuidos en todos los controladores de dominio (esta es la configuración predeterminada en todos los servidores basados en Windows Server 2003).

    Debido a la sobrecarga de replicación y al espacio que las tablas FileLinks usan en Active Directory, Microsoft recomienda desactivar el servicio de servidor de seguimiento de vínculos distribuidos en controladores de dominio de Active Directory. Para detener el servicio, use cualquiera de los métodos siguientes:

    • En el complemento Servicios (Services.msc o compmgmt.msc), haga doble clic en el servicio del servidor de seguimiento de vínculos distribuidos y, a continuación, haga clic en Deshabilitado en el cuadro Tipo de inicio.

    • Define el valor de inicio en el nodo Configuración del equipo/Configuración de Windows/Servicios del sistema de la directiva de grupo.

    • Definir la configuración de directiva en una unidad organizativa que hospeda todos los controladores de dominio de Windows 2000.

    Reinicie los controladores de dominio después de que la directiva se haya replicado para que se aplique la directiva. Si no reinicia los controladores de dominio, tendrá que detener manualmente el servicio en cada controlador de dominio.

  2. Eliminar objetos de seguimiento de vínculos distribuidos de controladores de dominio de Active Directory.

    Vea la sección "Cómo eliminar el objeto de seguimiento de vínculos distribuidos" de este artículo para obtener más información sobre cómo eliminar objetos de seguimiento de vínculos distribuidos. Se recomienda eliminar objetos después de deshabilitar el servicio del servidor de seguimiento de vínculos distribuidos.

    Nota

    El tamaño del árbol de información de directorio (DIT) en controladores de dominio no se reduce hasta que se completen las siguientes acciones.

    1. Los objetos se eliminan del servicio de directorio.

      Nota

      Los objetos eliminados se almacenan en el contenedor Objetos eliminados hasta que expira la duración de la eliminación. El valor predeterminado para una duración de la lápida es de 60 días. El valor mínimo es de dos días. De forma predeterminada, el valor es de 180 días para los nuevos bosques que se instalan junto con Windows Server 2003 Service Pack 1 o una versión posterior de Windows Server 2003.

      A menos que tenga una supervisión de replicación de Active Directory sólida, se recomienda usar el valor de 180 días. No reduzca este valor para controlar los problemas de tamaño de DIT. Si tiene problemas con el tamaño de la base de datos, póngase en contacto con el Servicio de soporte al cliente de Microsoft.

    2. La recolección de elementos no utilizados se ha ejecutado hasta su finalización.

    3. Puede usar Ntdsutil.exe para desfragmentar el archivo Ntds.dit en modo Dsrepair.

No es fundamental que elimine manualmente los objetos de seguimiento de vínculos distribuidos después de detener el servicio del servidor de seguimiento de vínculos distribuidos a menos que tenga que recuperar el espacio en disco que consumen estos objetos lo más rápido posible. Los clientes de seguimiento de vínculos distribuidos solicitan al servidor de seguimiento de vínculos distribuidos que actualice los vínculos cada 30 días. El servicio del servidor de seguimiento de vínculos distribuidos rastrea objetos que no se han actualizado en 90 días.

Al ejecutar el Dltpurge.vbs VBScript, todos los objetos de Active Directory que usa el servicio de servidor de seguimiento de vínculos distribuidos se eliminan del dominio donde se ejecuta el script. Debe ejecutar el script en un controlador de dominio para cada dominio de un bosque. Para ejecutar Dltpurge.vbs:

  1. Obtenga el script Dltpurge.vbs de soporte técnico de Microsoft.

  2. Detenga el servicio del servidor de seguimiento de vínculos distribuidos en todos los controladores de dominio del dominio al que se va a dirigir Dltpurge.vbs.

  3. Use privilegios de administrador para iniciar sesión en la consola de un controlador de dominio o un equipo miembro del dominio al que se dirigirá Dltpurge.vbs.

  4. Use la siguiente sintaxis para ejecutar Dltpurge.vbs desde una línea de comandos:

    cscript dltpurge.vbs -s myserver -d dc=mydomain,dc=mycompany,dc=com  
    

    En esta línea de comandos:

    • -s es el nombre de host DNS del controlador de dominio en el que desea eliminar los objetos de seguimiento de vínculos distribuidos.
    • -d es la ruta de acceso de nombre distintivo del dominio en el que desea eliminar objetos de seguimiento de vínculos distribuidos.
  5. Realice un procedimiento de desfragmentación sin conexión del archivo Ntds.dit después de que los objetos se hayan desfragmentado y se hayan recopilado elementos no utilizados. Para obtener más información acerca del proceso de recolección de elementos no utilizados, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

    198793 Proceso de recolección de elementos no utilizados de la base de datos de Active Directory

Una experiencia de cliente de ejemplo

El peor escenario que se describe en esta sección ilustra algunos problemas que se deben tener en cuenta al eliminar un gran número de objetos de seguimiento de vínculos distribuidos en un dominio de producción grande.

Trey Research, un cliente ficticio de Fortune 500 con más de 40 000 empleados en todo el mundo, implementa un único bosque de Active Directory que consta de un dominio raíz vacío con dominios secundarios que asignan las principales regiones geográficas del mundo (Norteamérica, Asia, Europa, entre otros). El dominio más grande del bosque contiene unas 35.000 cuentas de usuario y el mismo número de cuentas de equipo.

Los archivos Ntds.dit se colocaron en matrices de raid de 18 gigabytes (GB). Desde la implementación inicial de Windows 2000, los archivos de catálogo global han aumentado a 17 GB.

Trey Research desea implementar Windows Server 2003 en los próximos 10 días, pero necesita al menos 1,5 GB de espacio en disco disponible en la partición de base de datos antes de iniciar la actualización. Necesitan esta cantidad de espacio en disco porque se sabe Adprep.exe agregar de tres a cinco as heredados en función de las revisiones y Service Pack que se hayan instalado anteriormente. Las siguientes condiciones contribuyen al gran tamaño del catálogo global o a la falta de espacio en disco:

  • Condición 1: Trey Research fue un primer usuario de Windows 2000 y las unidades más grandes que recibieron de su proveedor de hardware preferido eran 9 GB o 18 GB cuando se configuraron en una matriz de raid. Las unidades actuales tienen el doble de tamaño para la mitad del costo.

  • Condición 2: El scavenging de DNS no estaba habilitado en zonas DNS integradas en Active Directory que se delegaban en cada dominio del bosque.

  • Condición 3: Los usuarios de dominio tenían permiso para crear cuentas de equipo en el dominio. Los administradores no tienen un proceso periódico para identificar y eliminar cuentas de equipo huérfanas.

  • Condición 4: A lo largo del tiempo, los administradores, service packs y revisiones definieron descriptores de seguridad en los responsables del contexto de nomenclatura raíz (NC) (cn=schema, cn=configuration, cn= domain) y otros contenedores que hospedan miles de objetos en Active Directory. Además, se habilitó la auditoría en las mismas particiones. Al establecer permisos y habilitar la auditoría en objetos de Active Directory, aumenta el tamaño de la base de datos. La herramienta que prepara bosques y dominios de Windows 2000 para controladores de dominio basados en Windows Server 2003 (Adprep) también agrega ases heredados; por lo tanto, Trey Research necesitaba liberar espacio en la unidad de disco antes de actualizar el dominio.

  • Condición 5: Trey Research no realizaba regularmente procedimientos de desfragmentación sin conexión de archivos Ntds.dit en modo Dsrepair.

  • Condición 6: Cuando se revisó el contenedor CN=FileLinks,CN=System,DC= del dominio más grande, se revelaron más de 700 000 objetos de seguimiento de vínculos distribuidos. El descriptor de seguridad de cada objeto de seguimiento de vínculos distribuidos era de aproximadamente 2 kilobytes (KB). Cada una de estas condiciones se evaluó por su contribución al archivo .dit de 17 GB:

  • Condición 1: Trey Research decidió no implementar nuevas unidades debido al costo y el tiempo que se tardaría en hacerlo. Además, solo necesitaban el espacio en disco temporalmente porque esperaban que la base de datos de Active Directory se reducira después de actualizar a Windows Server 2003 y de que se completara el proceso de almacén de instancia única (SIS implementa un almacenamiento de permisos más eficaz en bases de datos de Active Directory).

  • Condiciones 2 y 3: Trey Research decidió que estas condiciones eran los procedimientos recomendados; sin embargo, incluso si Trey Research los implementara, no lograrían los resultados necesarios. Han decidido habilitar el scavenging de DNS porque se implementa fácilmente.

  • Condición 4: Trey Research se dio cuenta de que si redefinían descriptores de seguridad y listas de control de acceso del sistema (SACL), lograrían los resultados que estaban buscando, pero decidieron que este procedimiento requeriría mucho tiempo implementarse hasta que pudieran probar exhaustivamente la reducción de tamaño, la sobrecarga de replicación y, lo que es más importante, la compatibilidad de programa y administración en el escenario de laboratorio que refleja el entorno de producción.

    Dado que Trey Research ha implementado Windows 2000 SP2 y algunas revisiones, esperaban que los as heredados incrementales agregados por Adprep (a los objetos del dominio NC) podrían tener un tamaño de hasta 300 megabytes (MB). Podrían comprobar este comportamiento en un entorno de laboratorio que se usa para probar las actualizaciones del bosque de producción.

  • Condición 5: Trey Research se percató de que si realizaban un procedimiento de desfragmentación sin conexión, es posible que no recuperara "espacios en blanco" en el archivo Ntds.dit. De hecho, los administradores de Trey Research observaron un aumento en el tamaño de la base de datos inmediatamente después de completar el procedimiento de desfragmentación sin conexión. Este comportamiento se produjo debido a una ineficacia en el motor de base de datos de Windows 2000; este motor se ha mejorado en Windows Server 2003.

  • Condición 6: Trey Research aceptó que el curso obvio de acción sería realizar una eliminación masiva simple de todos los objetos de seguimiento de vínculos distribuidos del contenedor CN=FileLinks,CN=System,DC= de nombre de dominio en un controlador de dominio en cada dominio del bosque. Sin embargo, se percataron de que, si lo hacían, no se liberaría espacio en disco adicional hasta que los objetos se hubieran despilmentado y no utilizados, y hasta que completara un procedimiento de desfragmentación sin conexión en cada controlador de dominio de ese dominio. Aunque el valor de vigencia de la lápida se puede establecer en valores tan bajos como dos días, varios controladores de dominio del bosque de Trey Research estaban sin conexión mientras esperaban actualizaciones de hardware y software. Si los objetos se eliminan antes de que se pueda llevar a cabo la replicación de un extremo a otro, es posible que los objetos eliminados se vuelvan a aplicar o que se informe de datos incoherentes entre los servidores de catálogo global del bosque. Para proporcionar ayuda inmediata, Trey Research realizó el siguiente procedimiento:

  1. Quitaron el descriptor de seguridad predeterminado para los objetos de clase de esquema de seguimiento de vínculos distribuidos y lo reemplazaron por una única entidad de seguridad (cuenta de usuario).
  2. Escribieron un programa VBScript que quitó todos los descriptores de seguridad existentes y, a continuación, los reemplazó por un ace explícito para una única entidad de seguridad.
  3. Eliminaron objetos de seguimiento de vínculos distribuidos en incrementos de 10.000 unidades con un retraso de tres horas entre cada eliminación de objetos.
  4. Realizaron un procedimiento de desfragmentación sin conexión en cada controlador de dominio del dominio después de eliminar todos los objetos de seguimiento de vínculos distribuidos. Cuando Trey Research quitó el descriptor y realizó el procedimiento de desfragmentación, la base de datos recuperó aproximadamente 1,5 GB de espacio en disco en todos los controladores de dominio del dominio. Esta cantidad de espacio era suficiente para ejecutar de forma cómoda la herramienta Adprep y actualizar todos los controladores de dominio y catálogos globales basados en Windows 2000 a Windows Server 2003.

Después de que Trey Research actualizó el sistema operativo a Windows Server 2003, se libera más espacio en disco cuando la característica de almacén de instancia única en Windows Server 2003 redujo el tamaño de la base de datos a unos 8 GB (debe realizar un procedimiento de desfragmentación sin conexión para obtener estos resultados). Se recuperó más espacio después de que expirara el intervalo de TSL, se recopilaron objetos de seguimiento de vínculos distribuidos y se realizó un procedimiento de desfragmentación sin conexión.

Trey Research promovió un nuevo controlador de dominio basado en Windows 2000 en el dominio y colocó la cuenta de equipo en una unidad organizativa diferente de la que usaban normalmente. En dos días, había unos 8.000 objetos de seguimiento de vínculos distribuidos en el controlador de dominio basado en Windows 2000. Trey Research detuvo el seguimiento de vínculos distribuidos o creó una directiva para detener el servicio y, a continuación, vinculó la directiva a unidades organizativas que hospedan controladores de dominio basados en Windows 2000. Por último, Trey Research usó Dltpurge.vbs para marcar los objetos de seguimiento de vínculos distribuidos restantes para su eliminación.

Anatomía de la eliminación de objetos DLT

Los propios objetos DLT contienen pocos atributos y usan poco espacio en Active Directory. Cuando un objeto está marcado para su eliminación (eliminado), se quitan todos los atributos innecesarios, excepto los necesarios para realizar un seguimiento del objeto hasta que se purgue de Active Directory.

En el caso de los objetos de seguimiento de vínculos, marcar el objeto para su eliminación solo equivale a dos atributos que se quitan: dscorepropagationdata y objectcategory. La eliminación de los dos atributos da como resultado un ahorro inicial de 34 bytes. Sin embargo, el proceso de marcar el objeto de seguimiento de vínculos para su eliminación también actualiza el objeto agregando un atributo IS_DELETED (4 bytes) y haciendo que los atributos RDN y "nombre común" aumenten unos 80 bytes. Además, el atributo "replication metadata" también crece unos 50 bytes para reflejar las actualizaciones realizadas en este objeto. Por lo tanto, al marcar un objeto de seguimiento de vínculos para su eliminación, el objeto terminará creciendo en aproximadamente 200 bytes. The NTDS. DIT no mostrará una reducción de tamaño hasta que los objetos eliminados se hayan eliminado, se hayan recolectado elementos no utilizados y se haya realizado una desfragmentación sin conexión.

Nota

Si el servicio está desactivado como se recomienda en este artículo, no se produce la limpieza automática.

Versión de texto de Dltpurge.vbs

Para usar este script:

  1. Copie todo el texto entre la etiqueta y la etiqueta de este artículo y, a continuación, pegue el texto en un archivo de editor de texto ASCII (por ejemplo, un archivo del Bloc de notas de Microsoft).
  2. Guarde el archivo como "Dltpurge.vbs". 3 Complete el procedimiento descrito en Cómo eliminar objetos de seguimiento de vínculos distribuidos
<Start Copy Here>
'==============================================================================
'==============================================================================
'
' Copyright (C) 2001 by Microsoft Corporation.  All rights reserved.
'
' This script deletes all Active Directory objects used by the
' Distributed Link Tracking Server service.
'
' It is assumed that the DLT Server service has been disabled,
' and you wish to recover the DIT space these objects occupy.
'
' Usage:   cscript DltPurge.vbs <options>
' Options: -s ServerName
'          -d distinguishedname dc=mydomain,dc=mycompany,dc=com
'          -b BatchSize  BatchDelayMinutes
'          -t (optional test mode)
'
' The objects are deleted in batches - BatchSize objects are deleted,
' then there is a BatchDelayMinutes delay before the next batch.
'
'==============================================================================
'==============================================================================

Option Explicit

'
' Globals, also local to main.
'
Dim oProvider
Dim oTarget
Dim sServer
Dim sDomain
Dim bTest

Dim BatchSize
Dim BatchDelayMinutes

'
' Set defaults
'

BatchSize = 1000
BatchDelayMinutes = 15
bTest = False

'==============================================================================
'
'   ProcessArgs
'
'   Parse the command-line arguments.  Results are set in global variables
'   (oProvider, oTarget, sServer, sDomain, BatchSize, and BatchDelayMinutes).
'
'==============================================================================


public function ProcessArgs

    Dim iCount
    Dim oArgs

    on error resume next

    '
    ' Get the command-line arguments
    '
    
    Set oArgs = WScript.Arguments

    if oArgs.Count > 0 then

        '
        ' We have command-line arguments.  Loop through them.
        '

        iCount = 0
        ProcessArgs = 0

        do while iCount < oArgs.Count

            select case oArgs.Item(iCount)

                '
                ' Server name argument
                '
                
                case "-s"

                    if( iCount + 1 >= oArgs.Count ) then
                        Syntax
                        ProcessArgs = -1
                        exit do
                    end if

                    sServer = oArgs.Item(iCount+1)
                    if Len(sServer) > 0 then sServer = sServer & "/"
                    iCount = iCount + 2

                '
                ' Enable testing option
                '
                
                case "-t"

                    iCount = iCount + 1
                    bTest  = True

                '
                ' Domain name option
                '
                
                case "-d"

                    if( iCount + 1 >= oArgs.Count ) then
                        Syntax
                        ProcessArgs = -1
                        Exit Do
                    end if

                    sDomain = oArgs.Item(iCount+1)
                    iCount = iCount + 2

                '
                ' Batching option (batch size, batch delay)
                '

                case "-b"

                    if( iCount + 2 >= oArgs.Count ) then
                        Syntax
                        ProcessArgs = -1
                        exit do
                    end if

                    Err.Clear
                    
                    BatchSize = CInt( oArgs.Item(iCount+1) )
                    BatchDelayMinutes = CInt( oArgs.Item(iCount+2) )
                    
                    if( Err.Number <> 0 ) then 
                        wscript.echo "Invalid value for -b argument" & vbCrLf
                        Syntax
                        ProcessArgs = -1
                        exit do
                    end if
                    
                    iCount = iCount + 3

                '
                ' Help option
                '
                
                case "-?"
                    Syntax
                    ProcessArgs = -1
                    exit do

                '
                ' Invalid argument
                '
                
                case else
                
                    ' Display the syntax and return an error

                    wscript.echo "Unknown argument: " & oArgs.Item(iCount) & vbCrLf
                    Syntax
                    ProcessArgs = -1
                    Exit Do
                    
            end select
      loop

    else
    
        '
        ' There were no command-line arguments, display the syntax
        ' and return an error.
        '

        Syntax
        ProcessArgs = -1

    end if

    Set oArgs = Nothing

end function ' ProcessArgs

'==============================================================================
'
'   Syntax
'
'   Show the command-line syntax
'
'==============================================================================

public function Syntax

    wscript.echo    vbCrLf & _
                    "Purpose:   Delete Active Directory objects from Distributed Link Tracking" & vbCrLf & _
                    "           Server service (Assumes that DLT Server has been disabled" & vbCrLf & _
                    "           on all DCs)" & vbCrLf & _
                    vbCrLf & _
                    "Usage:     " & wscript.scriptname & " <arguments>" & vbCrLf & _
                    vbCrLf & _
                    "Arguments: -s Server" & vbCrLf & _
                    "           -d FullyQualifiedDomain" & vbCrLf & _
                    "           -b BatchSize BatchDelayMinutes (default to 1000 and 15)" & vbCrLf & _
                    "           -t (optional test mode, nothing is deleted)" & vbCrLf & _
                    vbCrLf & _
                    "Note:      Objects are deleted in batches, with a delay between each" & vbCrLf & _
                    "           batch.  The size of the batch defaults to 1000 objects, and" & vbCrLf & _
                    "           the length of the delay defaults to 15 minutes.  But these" & vbCrLf & _
                    "           values can be overridden using the -b option." & vbCrLf & _
                    vbCrLf & _
                    "Example:   " & wscript.scriptname & "  -s  myserver  -d distinguishedname dc=mydomain,dc=mycompany,dc=com "

end function    ' Syntax



'==============================================================================
'
'   PurgeContainer
'
'   Delete all objects of the specified class in the specified container.
'   This subroutine is called once for the volume table and once for
'   the object move table.
'
'==============================================================================

sub PurgeContainer(ByRef oParent, ByVal strClass)

    dim oChild
    dim iBatch
    dim iTotal

    On Error Resume Next

    iTotal = 0
    iBatch = 0

    ' Loop through the children of this container

    For Each oChild in oParent

        ' 
        ' Is this a DLT object?
        '

        
        if oChild.Class = strClass Then

            '
            ' Yes, this is a DLT object, it may be deleted
            '
            
            iTotal = iTotal + 1
            iBatch = iBatch + 1

            '
            ' Delete the object
            '
            
            if bTest then
                wscript.echo "Object that would be deleted: " & oChild.adspath
            else
                oParent.Delete oChild.Class, oChild.Name
            end if

            '
            ' If this is the end of a batch, delay to let replication
            ' catch up.
            '
            
            if iBatch = BatchSize then
            
                iBatch = 0
                
                wscript.stdout.writeline "" ' ignored by wscript
                wscript.echo "Deleted " & BatchSize & " objects"
                wscript.echo "Pausing to allow processing (will restart at " & DateAdd("n", BatchDelayMinutes, Time) & ")"
                
                wscript.sleep BatchDelayMinutes * 60 * 1000
                wscript.echo "Continuing ..."
                
            end if
            
        else
        
            ' oChild.Class didn't match strClass
            wscript.echo "Ignoring unexpected class: " & oChild.Class
            
        end if

        oChild = NULL

    Next


    wscript.echo "Deleted a total of " & iTotal & " objects"

end sub ' PurgeContainer


'==============================================================================
'
' Main
'
'==============================================================================

if (ProcessArgs=-1) then wscript.quit

on error resume next

'
' Explain what's about to happen
'

wscript.stdout.writeline "" ' ignored by wscript
wscript.echo "This script will purge all objects from the Active Directory" & vbCrLf & _
             "used by the Distributed Link Tracking Server service (trksvr)." & vbCrLf & _
             "It is assumed that this service has already been disabled on" & vbCrLf & _
             "all DCs in the domain."

'
' When running in cscript, pause to give an opportunity to break out
' (These 3 lines are for cscript and ignored by wscript.)
'

wscript.stdout.writeline ""
wscript.stdout.writeline "Press Enter to continue ..."
wscript.stdin.readline

'
' Get an ADSI object
'

Set oProvider = GetObject("LDAP:")

'
' Purge the System/FileLinks/ObjectMoveTable
'

wscript.stdout.writeline "" ' ignored by wscript
wscript.echo "Purging ObjectMoveTable"

Set oTarget = oProvider.OpenDSObject( "LDAP://" & sServer  & "cn=ObjectMoveTable,CN=FileLinks,CN=System," & sDomain ,_
                                      vbNullString, vbNullString, _
                                      1) ' ADS_SECURE_AUTHENTICATION

call PurgeContainer( oTarget, "linkTrackOMTEntry" )
oTarget = NULL

'
' Purge the System/FileLinks/VolumeTable
'

wscript.stdout.writeline "" ' ignored by wscript
wscript.echo "Purging VolumeTable"

Set oTarget = oProvider.OpenDSObject("LDAP://" & sServer  & "cn=VolumeTable,CN=FileLinks,CN=System," & sDomain  ,_
                                     vbNullString, vbNullString, _
                                     1) ' ADS_SECURE_AUTHENTICATION
call PurgeContainer( oTarget, "linkTrackVolEntry" )
oTarget = NULL

oProvider = NULL
<END Copy Here>