Rilevamento dei collegamenti distribuiti nei controller di dominio basati su Windows

Questo articolo descrive come usare i servizi di rilevamento dei collegamenti distribuiti in Windows per tenere traccia della creazione e dello spostamento di file collegati tra volumi e server formattati NTFS.

Si applica a: Windows Server 2012 R2
Numero KB originale: 312403

È possibile usare il servizio Server di rilevamento collegamenti distribuiti e il servizio client di rilevamento collegamenti distribuiti per tenere traccia dei collegamenti ai file nelle partizioni formattate con NTFS. Rilevamento collegamenti distribuiti tiene traccia dei collegamenti in scenari in cui il collegamento viene eseguito a un file in un volume NTFS, ad esempio collegamenti alla shell e collegamenti OLE. Se il file viene rinominato, spostato in un altro volume nello stesso computer, spostato in un altro computer o spostato in altri scenari simili, Windows usa Rilevamento collegamenti distribuiti per trovare il file. Quando si accede a un collegamento spostato, Rilevamento collegamenti distribuiti individua il collegamento; non si è a conoscenza dello spostamento del file o dell'uso di Rilevamento collegamenti distribuiti per trovare il file spostato.

Il rilevamento dei collegamenti distribuiti è costituito da un servizio client e da un servizio server. Il servizio Server di rilevamento collegamenti distribuiti viene eseguito esclusivamente nei controller di dominio basati su Windows Server. Archivia le informazioni in Active Directory e fornisce servizi per aiutare il servizio client di rilevamento dei collegamenti distribuiti. Il servizio client di rilevamento dei collegamenti distribuiti viene eseguito in tutti i computer basati su Windows 2000 e microsoft Windows XP, inclusi quelli in ambienti di gruppo di lavoro o non inclusi in un gruppo di lavoro. Fornisce l'unica interazione con i server di rilevamento dei collegamenti distribuiti.

I client di rilevamento dei collegamenti distribuiti forniscono occasionalmente al servizio Server di rilevamento collegamenti distribuiti informazioni sui collegamenti di file, archiviate dal servizio Server di rilevamento collegamenti distribuiti in Active Directory. I client di rilevamento collegamenti distribuiti possono anche eseguire query sul servizio Server di rilevamento collegamenti distribuiti per ottenere tali informazioni quando non è possibile risolvere un collegamento alla shell o un collegamento OLE. I client di rilevamento dei collegamenti distribuiti richiedono al server di rilevamento collegamenti distribuiti di aggiornare i collegamenti ogni 30 giorni. Il servizio Distributed Link Tracking Server esegue lo scavenges di oggetti che non sono stati aggiornati in 90 giorni

Quando un file a cui fa riferimento un collegamento viene spostato in un altro volume (nello stesso computer o in un computer diverso), il client Di rilevamento collegamenti distribuiti invia una notifica al server di rilevamento collegamenti distribuiti, che crea un oggetto linkTrackOMTEntry in Active Directory. Un oggetto linkTrackVolEntry viene creato in Active Directory per ogni volume NTFS nel dominio.

Nota

In Windows Server 2008 e versioni successive, il servizio Server di rilevamento collegamenti distribuiti non è più incluso in Windows. È quindi possibile rimuovere in modo sicuro gli oggetti da Active Directory.

Gli oggetti rilevamento collegamenti distribuiti vengono replicati tra tutti i controller di dominio nel dominio che ospita l'account computer e tutti i server di catalogo globale nella foresta. Il servizio Server di rilevamento collegamenti distribuiti crea oggetti nel percorso del nome distinto seguente:

CN=FileLinks,CN=System,DC= contenitore del nome di dominio di Active Directory

Gli oggetti rilevamento collegamenti distribuiti sono presenti nelle due tabelle seguenti nella cartella CN=FileLinks,CN=System:

  • CN=ObjectMoveTable,CN=FileLinks,CN=System,DC= nome di dominio:

Questo oggetto archivia le informazioni sui file collegati che sono stati spostati nel dominio.

  • CN=VolumeTable,CN=FileLinks,CN=System,DC= nome di dominio:

    Questo oggetto archivia le informazioni su ogni volume NTFS nel dominio.

Gli oggetti di rilevamento dei collegamenti distribuiti consumano poco spazio singolarmente, ma possono utilizzare grandi quantità di spazio in Active Directory quando sono autorizzati ad accumularsi nel tempo.

Se si disabilita Rilevamento collegamenti distribuiti ed si eliminano gli oggetti rilevamento collegamenti distribuiti da Active Directory, potrebbe verificarsi il comportamento seguente:

  • È possibile ridurre le dimensioni del database di Active Directory. Questo comportamento si verifica dopo che gli oggetti sono stati rimossi e sottoposti a Garbage Collection e dopo aver eseguito una procedura di deframmentazione offline.
  • Il traffico di replica tra controller di dominio può essere ridotto.

In Windows 2000, Windows XP e Windows Server 2003, il valore di avvio per il servizio Client di rilevamento collegamenti distribuiti è impostato su Automatico. Nei server basati su Windows 2000, il servizio Server di rilevamento collegamenti distribuiti viene avviato manualmente, per impostazione predefinita. Tuttavia, se si usa Dcpromo.exe per alzare di livello un server a un dominio, il servizio Server di rilevamento collegamenti distribuiti viene configurato per l'avvio automatico.

Per i server basati su Windows Server 2003, il servizio Server di rilevamento collegamenti distribuiti è disabilitato per impostazione predefinita. Quando si usa Dcpromo.exe per alzare di livello un server a un dominio, il servizio Server di rilevamento collegamenti distribuiti non è configurato per l'avvio automatico. Quando un controller di dominio basato su Windows 2000 viene aggiornato a Windows Server 2003, anche il servizio Server di rilevamento collegamenti distribuiti viene disabilitato durante l'aggiornamento. Se si è un amministratore e si vuole usare il servizio Server di rilevamento collegamenti distribuiti, è necessario usare Criteri di gruppo oppure impostare manualmente il servizio per l'avvio automatico. Inoltre, il servizio client di rilevamento dei collegamenti distribuiti nei computer che eseguono Windows Server 2003 o Windows XP SP1 non tenta di usare il servizio Server di rilevamento collegamenti distribuiti per impostazione predefinita. Se si desidera configurare tali computer per sfruttare i vantaggi del servizio Server di rilevamento collegamenti distribuiti, abilitare l'impostazione dei criteri Consenti ai client di rilevamento collegamenti distribuiti di usare le risorse di dominio. A tale scopo, aprire il nodo Configurazione computer/Modelli amministrativi/Sistema in Criteri di gruppo.

Microsoft consiglia di usare le impostazioni seguenti con Il rilevamento dei collegamenti distribuiti nei server basati su Windows 2000:

  1. Disattivare il servizio Server di rilevamento collegamenti distribuiti in tutti i controller di dominio (questa è la configurazione predefinita in tutti i server basati su Windows Server 2003).

    A causa del sovraccarico della replica e dello spazio usato dalle tabelle FileLinks in Active Directory, Microsoft consiglia di disattivare il servizio Server di rilevamento collegamenti distribuiti nei controller di dominio Active Directory. Per arrestare il servizio, usare uno dei metodi seguenti:

    • Nello snap-in Servizi (Services.msc o compmgmt.msc) fare doppio clic sul servizio Server di rilevamento collegamenti distribuiti e quindi fare clic su Disabilitato nella casella Tipo di avvio .

    • Definire il valore di avvio nel nodo Configurazione computer/Impostazioni di Windows/Servizi di sistema di Criteri di gruppo.

    • Definire le impostazioni dei criteri in un'unità organizzativa che ospita tutti i controller di dominio Windows 2000.

    Riavviare i controller di dominio dopo la replica dei criteri in modo che i criteri vengano applicati. Se non si riavviano i controller di dominio, sarà necessario arrestare manualmente il servizio in ogni controller di dominio.

  2. Eliminare oggetti rilevamento collegamenti distribuiti dai controller di dominio active directory.

    Vedere la sezione "How to Delete Distributed Link Tracking Object" di questo articolo per altre informazioni su come eliminare oggetti rilevamento collegamenti distribuiti. È consigliabile eliminare gli oggetti dopo aver disabilitato il servizio Server di rilevamento collegamenti distribuiti.

    Nota

    Le dimensioni di DIRECTORY Information Tree (DIT) nei controller di dominio non vengono ridotte fino al completamento delle azioni seguenti.

    1. Gli oggetti vengono eliminati dal servizio directory.

      Nota

      Gli oggetti eliminati vengono archiviati nel contenitore Oggetti eliminati fino alla scadenza della durata della rimozione definitiva. Il valore predefinito per una durata di rimozione definitiva è 60 giorni. Il valore minimo è di due giorni. Per impostazione predefinita, il valore è 180 giorni per le nuove foreste installate insieme a Windows Server 2003 Service Pack 1 o una versione successiva di Windows Server 2003.

      A meno che non si disponga di un monitoraggio avanzato della replica di Active Directory, è consigliabile usare il valore di 180 giorni. Non ridurre questo valore per gestire i problemi di dimensioni DIT. In caso di problemi con le dimensioni del database, contattare il Servizio Supporto Tecnico Clienti Microsoft.

    2. Garbage Collection è stato eseguito fino al completamento.

    3. Usare Ntdsutil.exe per deframmentare il file Ntds.dit in modalità Dsrepair.

Non è fondamentale eliminare manualmente gli oggetti rilevamento collegamenti distribuiti dopo aver interrotto il servizio server di rilevamento collegamenti distribuiti, a meno che non sia necessario recuperare lo spazio su disco utilizzato da questi oggetti il più rapidamente possibile. I client di rilevamento dei collegamenti distribuiti richiedono al server di rilevamento collegamenti distribuiti di aggiornare i collegamenti ogni 30 giorni. Il servizio Distributed Link Tracking Server esegue lo scavenges di oggetti che non sono stati aggiornati in 90 giorni.

Quando si esegue il Dltpurge.vbs VBScript, tutti gli oggetti active directory usati dal servizio Server di rilevamento collegamenti distribuiti vengono eliminati dal dominio in cui viene eseguito lo script. È necessario eseguire lo script in un controller di dominio per ogni dominio in una foresta. Per eseguire Dltpurge.vbs:

  1. Ottenere lo script Dltpurge.vbs dal supporto tecnico Microsoft.

  2. Arrestare il servizio Server di rilevamento collegamenti distribuiti in tutti i controller di dominio del dominio di destinazione di Dltpurge.vbs.

  3. Usare i privilegi di amministratore per accedere alla console di un controller di dominio o di un computer membro nel dominio di destinazione di Dltpurge.vbs.

  4. Usare la sintassi seguente per eseguire Dltpurge.vbs da una riga di comando:

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

    In questa riga di comando:

    • -s è il nome host DNS del controller di dominio in cui si desidera eliminare gli oggetti rilevamento collegamenti distribuiti.
    • -d è il percorso del nome distinto del dominio in cui si desidera eliminare gli oggetti rilevamento collegamenti distribuiti.
  5. Eseguire una procedura di deframmentazione offline del file Ntds.dit dopo la rimozione definitiva degli oggetti e la garbage collection. Per altre informazioni sul processo di Garbage Collection, fare clic sul numero dell'articolo della Microsoft Knowledge Base seguente:

    198793 Processo di Garbage Collection del database active directory

Un'esperienza cliente di esempio

Lo scenario peggiore descritto in questa sezione illustra alcuni problemi da considerare quando si elimina un numero elevato di oggetti rilevamento collegamenti distribuiti in un dominio di produzione di grandi dimensioni.

Trey Research, un cliente fittizio di Fortune 500 con oltre 40.000 dipendenti in tutto il mondo, distribuisce una singola foresta di Active Directory costituita da un dominio radice vuoto con domini figlio che mappano le principali aree geografiche del mondo (America del Nord, Asia, Europa e così via). Il dominio più grande nella foresta contiene circa 35.000 account utente e lo stesso numero di account computer.

I file Ntds.dit sono stati inseriti in matrici raid da 18 gigabyte (GB). Dalla distribuzione iniziale di Windows 2000, i file di catalogo globale sono cresciuti fino a 17 GB.

Trey Research vuole distribuire Windows Server 2003 entro i prossimi 10 giorni, ma richiede almeno 1,5 GB di spazio su disco disponibile nella partizione di database prima di avviare l'aggiornamento. Hanno bisogno di questo spazio su disco perché Adprep.exe è noto per aggiungere tre a cinque assi ereditati a seconda degli hotfix e dei Service Pack installati in precedenza. Le condizioni seguenti contribuiscono alle grandi dimensioni del catalogo globale o alla mancanza di spazio su disco:

  • Condizione 1: Trey Research è stato uno dei primi ad adottare Windows 2000 e le unità più grandi ricevute dal fornitore di hardware preferito erano 9 GB o 18 GB quando erano configurate in un array raid. Le unità correnti hanno dimensioni doppie per metà del costo.

  • Condizione 2: lo scavenging DNS non è stato abilitato nelle zone DNS integrate in Active Directory delegate a ogni dominio nella foresta.

  • Condizione 3: agli utenti di dominio è stato consentito creare account computer nel dominio. Gli amministratori non hanno avuto un processo ricorrente per identificare ed eliminare gli account computer orfani.

  • Condizione 4: nel corso del tempo, i descrittori di sicurezza sono stati definiti da amministratori, Service Pack e hotfix sulle testine del contesto di denominazione radice (CN) (cn=schema, cn=configuration, cn= dominio) e altri contenitori che ospitano migliaia di oggetti in Active Directory. Inoltre, il controllo è stato abilitato nelle stesse partizioni. Quando si impostano le autorizzazioni e si abilita il controllo sugli oggetti in Active Directory, le dimensioni del database aumentano. Lo strumento che prepara le foreste e i domini di Windows 2000 per i controller di dominio basati su Windows Server 2003 (Adprep) aggiunge anche gli assi ereditati; Pertanto, Trey Research aveva bisogno di liberare spazio sull'unità disco prima di aggiornare il dominio.

  • Condizione 5: Trey Research non ha eseguito regolarmente le procedure di deframmentazione offline dei file Ntds.dit in modalità Dsrepair.

  • Condizione 6: quando il contenitore CN=FileLinks,CN=System,DC= nome di dominio nel dominio più grande è stato esaminato, sono stati rivelati oltre 700.000 oggetti rilevamento collegamenti distribuiti. Il descrittore di sicurezza in ogni oggetto Di rilevamento collegamenti distribuiti era di circa 2 kilobyte (KB). Ognuna di queste condizioni è stata valutata per il contributo al file con estensione dit da 17 GB:

  • Condizione 1: Trey Research ha deciso di non distribuire nuove unità a causa del costo e del tempo necessario per farlo. Inoltre, avevano bisogno solo temporaneamente dello spazio su disco perché si aspettavano la compattazione del database di Active Directory dopo l'aggiornamento a Windows Server 2003 e il completamento del processo sis (Single Instance Store) (SIS implementa un'archiviazione più efficiente delle autorizzazioni nei database di Active Directory).

  • Condizioni 2 e 3: Trey Research ha deciso che queste condizioni erano le migliori pratiche; tuttavia, anche se Trey Research li implementasse, non otterrebbero i risultati necessari. Hanno deciso di abilitare lo scavenging DNS perché è facilmente implementato.

  • Condizione 4: Trey Research si è resa conto che se ridefinissero i descrittori di sicurezza e gli elenchi di controllo di accesso di sistema (SCL), avrebbero ottenuto i risultati che stanno cercando, ma hanno deciso che questa procedura richiederebbe molto tempo per essere implementata fino a quando non fosse possibile testare accuratamente la riduzione delle dimensioni, il sovraccarico della replica e, soprattutto, la compatibilità tra programma e amministrazione nello scenario lab che rispecchia l'ambiente di produzione.

    Poiché Trey Research ha distribuito Windows 2000 SP2 e alcuni hotfix, si aspettavano che gli assi ereditati incrementali aggiunti da Adprep (agli oggetti nel controller di rete del dominio) potessero essere fino a 300 megabyte (MB). È possibile verificare questo comportamento in un ambiente lab usato per testare gli aggiornamenti della foresta di produzione.

  • Condizione 5: Trey Research si è reso conto che se hanno eseguito una procedura di deframmentazione offline, potrebbero non recuperare "spazi vuoti" nel file Ntds.dit. Gli amministratori di Trey Research hanno infatti notato un aumento delle dimensioni del database subito dopo aver completato la procedura di deframmentazione offline. Questo comportamento si è verificato a causa di un'inefficienza nel motore di database di Windows 2000; questo motore è stato migliorato in Windows Server 2003.

  • Condizione 6: Trey Research ha concordato che la soluzione più ovvia sarebbe stata quella di eseguire una semplice eliminazione in blocco di tutti gli oggetti rilevamento collegamenti distribuiti dal contenitore CN=FileLinks,CN=System,DC= nome di dominio in un controller di dominio in ogni dominio della foresta. Tuttavia, si sono resi conto che se lo facessero, lo spazio su disco aggiuntivo non sarebbe stato liberato fino a quando gli oggetti non fossero stati rimossi in modo definitiva e non fossero stati sottoposti a Garbage Collection e fino a quando non avessero completato una procedura di deframmentazione offline in ogni controller di dominio in tale dominio. Anche se il valore di durata della rimozione definitiva può essere impostato su valori fino a due giorni, diversi controller di dominio nella foresta di Trey Research erano offline in attesa di aggiornamenti hardware e software. Se gli oggetti vengono rimossi definitivamente prima che sia possibile eseguire la replica end-to-end, gli oggetti eliminati possono essere rianimati o potrebbero essere segnalati dati incoerenti tra i server di catalogo globale nella foresta. Per fornire sollievo immediato, Trey Research ha eseguito la procedura seguente:

  1. È stato rimosso il descrittore di sicurezza predefinito per gli oggetti della classe dello schema di rilevamento collegamenti distribuiti e è stato sostituito con una singola entità di sicurezza (account utente).
  2. Hanno scritto un programma VBScript che ha rimosso tutti i descrittori di sicurezza esistenti e quindi li ha sostituiti con un asso esplicito per una singola entità di sicurezza.
  3. Sono stati eliminati oggetti Di rilevamento collegamenti distribuiti in incrementi di 10.000 unità con un ritardo di tre ore tra ogni eliminazione dell'oggetto.
  4. È stata eseguita una procedura di deframmentazione offline in ogni controller di dominio del dominio dopo l'eliminazione di tutti gli oggetti rilevamento collegamenti distribuiti. Quando Trey Research ha rimosso il descrittore ed eseguito la procedura di deframmentazione, il database ha recuperato circa 1,5 GB di spazio su disco in tutti i controller di dominio del dominio. Questa quantità di spazio era sufficiente per eseguire comodamente lo strumento Adprep e aggiornare tutti i controller di dominio basati su Windows 2000 e i cataloghi globali a Windows Server 2003.

Dopo che Trey Research ha aggiornato il sistema operativo a Windows Server 2003, è stato liberato più spazio su disco quando la funzionalità archivio a istanza singola in Windows Server 2003 ha ridotto le dimensioni del database a circa 8 GB (è necessario eseguire una procedura di deframmentazione offline per ottenere questi risultati). Più spazio è stato recuperato dopo la scadenza dell'intervallo TSL, gli oggetti di Rilevamento collegamenti distribuiti sono stati sottoposti a Garbage Collection ed è stata eseguita una procedura di deframmentazione offline.

Trey Research ha promosso un nuovo controller di dominio basato su Windows 2000 di replica nel dominio e ha inserito l'account computer in un'unità organizzativa diversa da quella usata in genere. In due giorni, circa 8.000 oggetti di rilevamento dei collegamenti distribuiti sono stati presenti nel controller di dominio basato su Windows 2000. Trey Research ha arrestato Il rilevamento dei collegamenti distribuiti o creato un criterio per arrestare il servizio e quindi collegato il criterio alle unità organizzative che ospitano controller di dominio basati su Windows 2000. Infine, Trey Research ha usato Dltpurge.vbs per contrassegnare gli oggetti di rilevamento collegamenti distribuiti rimanenti per l'eliminazione.

Anatomia dell'eliminazione di oggetti DLT

Gli oggetti DLT stessi contengono pochi attributi e usano poco spazio in Active Directory. Quando un oggetto è contrassegnato per l'eliminazione (con rimozione definitiva), tutti gli attributi non necessari vengono rimossi, ad eccezione di quelli necessari per tenere traccia dell'oggetto fino a quando non viene eliminato da Active Directory.

Nel caso degli oggetti di rilevamento dei collegamenti, contrassegnare l'oggetto per l'eliminazione equivale solo a due attributi da rimuovere: dscorepropagationdata e objectcategory. L'eliminazione dei due attributi comporta un risparmio iniziale di 34 byte. Tuttavia, il processo di contrassegno dell'oggetto di rilevamento dei collegamenti per l'eliminazione aggiorna anche l'oggetto aggiungendo un attributo di IS_DELETED (4 byte) e eseguendo il mapping degli attributi RDN e "common name", causando un aumento di circa 80 byte di ognuno di questi attributi. Inoltre, l'attributo "metadati di replica" aumenta di circa 50 byte per riflettere gli aggiornamenti eseguiti su questo oggetto. Quindi, contrassegnando un oggetto di rilevamento dei collegamenti per l'eliminazione, l'oggetto finirà per crescere di circa 200 byte. The NTDS. DIT non mostrerà una riduzione delle dimensioni fino a quando gli oggetti eliminati non saranno stati rimossi, non saranno stati sottoposti a Garbage Collection e non verrà eseguita una deframmentazione offline.

Nota

Se il servizio è disattivato come consigliato in questo articolo, la pulizia automatica non si verifica.

Versione testuale di Dltpurge.vbs

Per usare questo script:

  1. Copiare tutto il testo tra il <tag Avvia copia qui> e il <tag Fine copia qui> in questo articolo e quindi incollare il testo in un file dell'editor di testo ASCII, ad esempio un file del Blocco note Microsoft.
  2. Salvare il file come "Dltpurge.vbs". 3 Completare la procedura descritta in Come eliminare gli oggetti di rilevamento dei collegamenti distribuiti
<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>