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

En este artículo se describe cómo puede 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 en volúmenes y servidores con formato NTFS.

Se aplica a: Windows Server 2012 R2
Número de KB original: 312403

Puede usar el servicio Distributed Link Tracking Server y el servicio Distributed Link Tracking Client para realizar un seguimiento de vínculos a archivos en particiones con formato NTFS. Distributed Link Tracking realiza un seguimiento de vínculos en escenarios en los que el vínculo se realiza a un archivo de un volumen NTFS, como accesos directos del shell y vínculos OLE. Si se cambia el nombre de ese archivo, se mueve a otro volumen en el mismo equipo, se mueve a otro equipo o se mueve en otros escenarios similares, Windows usa Distributed Link Tracking para buscar el archivo. Al acceder a un vínculo que se ha movido, Distributed Link Tracking localiza el vínculo; no es consciente de que el archivo se ha movido o de que se usa Distributed Link Tracking para buscar el archivo movido.

Distributed Link Tracking consta de un servicio cliente y un servicio de servidor. El servicio Distributed Link Tracking Server se ejecuta exclusivamente en controladores de dominio basados en Windows Server. Almacena información en Active Directory y proporciona servicios para ayudar al servicio Distributed Link Tracking Client. El servicio Distributed Link Tracking Client se ejecuta en todos los equipos basados en Windows 2000 y Microsoft Windows XP, incluidos los de entornos de grupo de trabajo o los 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 Distributed Link Tracking proporcionan al servicio Distributed Link Tracking Server información sobre los vínculos de archivos que el servicio Distributed Link Tracking Server almacena en Active Directory. Los clientes de Seguimiento de vínculos distribuidos también pueden consultar al servicio Distributed Link Tracking Server para obtener esa información cuando no se puede resolver un acceso directo del shell o un vínculo OLE. Los clientes de Distributed Link Tracking solicitan al servidor de Seguimiento de vínculos distribuidos que actualice los vínculos cada 30 días. El servicio Distributed Link Tracking Server scavenges 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 Distributed Link Tracking Server ya no se incluye en Windows. Por lo tanto, puede quitar de forma segura los objetos de Active Directory.

Los objetos Distributed Link Tracking 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 Distributed Link Tracking Server crea objetos en la siguiente ruta de acceso de nombre distintivo:

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

Los objetos Distributed Link Tracking 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 sobre 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 en el 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 Distributed Link Tracking y elimina los objetos Distributed Link Tracking de Active Directory, puede producirse el siguiente comportamiento:

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

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 servidores basados en Windows 2000, el servicio Distributed Link Tracking Server se inicia manualmente de forma predeterminada. Sin embargo, si usa Dcpromo.exe para promover un servidor a un dominio, el servicio Distributed Link Tracking Server se configura para iniciarse automáticamente.

En el caso de los servidores basados en Windows Server 2003, el servicio Distributed Link Tracking Server está deshabilitado de forma predeterminada. Cuando se usa Dcpromo.exe para promover un servidor a un dominio, el servicio Distributed Link Tracking Server no está configurado para iniciarse automáticamente. Cuando se actualiza un controlador de dominio basado en Windows 2000 a Windows Server 2003, el servicio Distributed Link Tracking Server también se deshabilita durante la actualización. Si es administrador y quiere usar el servicio Distributed Link Tracking Server, debe usar directiva de grupo o debe establecer 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 Distributed Link Tracking Server de forma predeterminada. Si desea configurar esos equipos para aprovechar el servicio Distributed Link Tracking Server, habilite la configuración de directiva Permitir que los clientes de Seguimiento de vínculos distribuidos usen la directiva de recursos de dominio. Para ello, abra el nodo Configuración del equipo/Plantillas administrativas/Sistema en directiva de grupo.

Microsoft recomienda usar la siguiente configuración con Distributed Link Tracking en servidores basados en Windows 2000:

  1. Desactive el servicio Distributed Link Tracking Server 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 usan las tablas FileLinks en Active Directory, Microsoft recomienda desactivar el servicio Distributed Link Tracking Server en los 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 Servidor de seguimiento de vínculos distribuidos y, a continuación, haga clic en Deshabilitado en el cuadro Tipo de inicio .

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

    • Defina la configuración de directiva en una unidad organizativa que hospede 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.

    Consulte 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 Distributed Link Tracking Server.

    Nota:

    El tamaño del árbol de información de directorio (DIT) en los controladores de dominio no se reduce hasta que se completan 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 expire la duración del lápiz. El valor predeterminado de una duración de 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 bosques nuevos 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 segura de la replicación de Active Directory, se recomienda usar el valor de 180 días. No reduzca este valor para controlar problemas de tamaño de DIT. Si tiene problemas con el tamaño de la base de datos, póngase en contacto con los Servicios de soporte al cliente de Microsoft.

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

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

No es fundamental eliminar manualmente los objetos De seguimiento de vínculos distribuidos después de detener el servicio de servidor De seguimiento de vínculos distribuidos, a menos que tenga que reclamar el espacio en disco que consumen estos objetos lo antes posible. Los clientes de Distributed Link Tracking solicitan al servidor de Seguimiento de vínculos distribuidos que actualice los vínculos cada 30 días. El servicio Distributed Link Tracking Server scavenges 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 Distributed Link Tracking Server 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 de Dltpurge.vbs del soporte técnico de Microsoft Product.

  2. Detenga el servicio servidor de seguimiento de vínculos distribuidos en todos los controladores de dominio del dominio al que se dirige 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 dirige Dltpurge.vbs.

  4. Use la sintaxis siguiente 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 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 eliminado y recogido elementos no utilizados. Para obtener más información sobre el 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 el proceso de recolección de elementos no utilizados de la base de datos de Active Directory

Una experiencia de cliente de ejemplo

En el peor de los escenarios descritos en esta sección se muestran 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, etc.). El dominio más grande del bosque contiene aproximadamente 35 000 cuentas de usuario y el mismo número de cuentas de equipo.

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

Trey Research quiere 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 mucho espacio en disco porque se sabe que Adprep.exe agrega entre tres y cinco ases heredados en función de las revisiones y service packs 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 pionero de Windows 2000 y las unidades más grandes que recibieron de su proveedor de hardware preferido eran de 9 GB o 18 GB cuando se configuraron en una matriz raid. Las unidades actuales duplican el tamaño de la mitad del costo.

  • Condición 2: No se ha habilitado la depuración de DNS en zonas DNS integradas en Active Directory que se delegaron en cada dominio del bosque.

  • Condición 3: Se permitió a los usuarios del dominio crear cuentas de equipo en el dominio. Los administradores no tenían 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 encabezados 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, la auditoría se ha habilitado 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 realizó regularmente procedimientos de desfragmentación sin conexión de archivos Ntds.dit en modo Dsrepair.

  • Condición 6: cuando se revisó el contenedor de nombres de dominio CN=FileLinks,CN=System,DC= del dominio más grande, reveló 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 al 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 se completara el proceso del Almacén de instancia única (SIS) (SIS implementa un almacenamiento más eficaz de permisos en las bases de datos de Active Directory).

  • Condiciones 2 y 3: Trey Research decidió que estas condiciones eran las mejores prácticas; sin embargo, incluso si Trey Research los implementase, no lograrían los resultados necesarios. Decidieron habilitar la depuración de DNS porque se implementa fácilmente.

  • Condición 4: Trey Research se dio cuenta de que si redefinían los descriptores de seguridad y las listas de control de acceso del sistema (SACL), lograrían los resultados que buscaban, pero decidieron que este procedimiento tardaría mucho tiempo en implementarse hasta que pudieran probar exhaustivamente la reducción del tamaño, la sobrecarga de replicación y, lo 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 aces heredados incrementales agregados por Adprep (a los objetos del dominio NC) pudieran ser tan pequeños como 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 dio cuenta de que, si realizaban un procedimiento de desfragmentación sin conexión, es posible que no recuperaran "espacios en blanco" en el archivo Ntds.dit. De hecho, los administradores de Trey Research notaron 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 de acción obvio sería realizar una eliminación masiva simple de todos los objetos distributed link tracking del contenedor de nombres de dominio CN=FileLinks,CN=System,DC= en un controlador de dominio en cada dominio del bosque. Sin embargo, se dieron cuenta de que, si lo hacían, no se liberaría espacio en disco adicional hasta que los objetos se hubieran eliminado y recogido elementos no utilizados, y hasta que completaran un procedimiento de desfragmentación sin conexión en cada controlador de dominio de ese dominio. Aunque el valor de duración del lápiz se puede establecer en valores tan bajos como dos días, varios controladores de dominio del bosque de Trey Research estaban sin conexión a medida que esperaban actualizaciones de hardware y software. Si los objetos se quitan antes de que se pueda realizar la replicación de un extremo a otro, los objetos eliminados pueden reanimarse o se pueden notificar datos incoherentes entre los servidores de catálogo global del bosque. Para proporcionar alivio inmediato, Trey Research realizó el procedimiento siguiente:

  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 sola 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 sola 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 fue suficiente para ejecutar cómodamente 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 liberó más espacio en disco cuando la característica de almacén de instancia única de 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, los objetos De seguimiento de vínculos distribuidos se recogieron como elementos no utilizados y realizaron un procedimiento de desfragmentación sin conexión.

Trey Research promovió un nuevo controlador de dominio basado en Windows 2000 de réplica en el dominio y colocó la cuenta de equipo en una unidad organizativa diferente de la que solían usar. En dos días, alrededor de 8000 objetos de seguimiento de vínculos distribuidos estaban presentes 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 se marca para su eliminación (se elimina), se quitan todos los atributos innecesarios, excepto los necesarios para realizar un seguimiento del objeto hasta que se purga de Active Directory.

En el caso de los objetos de seguimiento de vínculos, marcar el objeto para su eliminación solo equivale a quitar dos atributos: 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 de IS_DELETED (4 bytes) y modificando el RDN y los atributos de "nombre común", lo que hace que cada uno de esos atributos crezca en unos 80 bytes. Además, el atributo "metadatos de replicación" también crece en 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. LOS NTD. 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 Start Copy Here> y la <etiqueta End Copy Here> 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 que se describe 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>