Gedistribueerde koppeling bijhouden op Windows-domeincontrollers

In dit artikel wordt beschreven hoe u de services voor het bijhouden van gedistribueerde koppelingen in Windows kunt gebruiken om het maken en verplaatsen van gekoppelde bestanden tussen NTFS-geformatteerde volumes en servers bij te houden.

Van toepassing op: Windows Server 2012 R2
Origineel KB-nummer: 312403

U kunt de Distributed Link Tracking Server-service en de Distributed Link Tracking Client-service gebruiken om koppelingen bij te houden naar bestanden op partities met NTFS-indeling. Met Distributed Link Tracking worden koppelingen bijgehouden in scenario's waarin de koppeling wordt gemaakt naar een bestand op een NTFS-volume, zoals shellsnelkoppelingen en OLE-koppelingen. Als dat bestand wordt gewijzigd, naar een ander volume op dezelfde computer wordt verplaatst, naar een andere computer wordt verplaatst of in andere vergelijkbare scenario's wordt verplaatst, gebruikt Windows Gedistribueerde koppeling bijhouden om het bestand te vinden. Wanneer u een koppeling opent die is verplaatst, zoekt Distributed Link Tracking de koppeling; U weet niet dat het bestand is verplaatst of dat Gedistribueerde koppeling bijhouden wordt gebruikt om het verplaatste bestand te vinden.

Distributed Link Tracking bestaat uit een clientservice en een serverservice. De service Distributed Link Tracking Server wordt uitsluitend uitgevoerd op domeincontrollers op basis van Windows Server. Het slaat informatie op in Active Directory en biedt services om de Distributed Link Tracking Client-service te helpen. De Distributed Link Tracking Client-service wordt uitgevoerd op alle Windows 2000- en Microsoft Windows XP-computers, inclusief computers in werkgroepomgevingen of computers die zich niet in een werkgroep bevinden. Het biedt de enige interactie met Distributed Link Tracking-servers.

Clients voor het bijhouden van gedistribueerde koppelingen bieden de service Distributed Link Tracking Server af en toe informatie over bestandskoppelingen, die de service Distributed Link Tracking Server opslaat in Active Directory. Clients voor het bijhouden van gedistribueerde koppelingen kunnen ook een query uitvoeren op de service Distributed Link Tracking Server voor die informatie wanneer een shellsnelkoppeling of een OLE-koppeling niet kan worden opgelost. Clients voor het bijhouden van gedistribueerde koppelingen vragen de Distributed Link Tracking-server om elke 30 dagen koppelingen bij te werken. De Distributed Link Tracking Server-service opruimt objecten die niet zijn bijgewerkt in 90 dagen

Wanneer een bestand waarnaar wordt verwezen door een koppeling wordt verplaatst naar een ander volume (op dezelfde computer of op een andere computer), meldt de Distributed Link Tracking-client de Distributed Link Tracking-server, die een linkTrackOMTEntry-object maakt in Active Directory. Er wordt een linkTrackVolEntry-object gemaakt in Active Directory voor elk NTFS-volume in het domein.

Opmerking

In Windows Server 2008 en hoger is de service Distributed Link Tracking Server niet meer opgenomen in Windows. U kunt de objecten dus veilig verwijderen uit Active Directory.

Distributed Link Tracking-objecten worden gerepliceerd tussen alle domeincontrollers in het domein dat als host fungeert voor het computeraccount en alle globale catalogusservers in het forest. De service Distributed Link Tracking Server maakt objecten in het volgende DN-naampad:

CN=FileLinks,CN=System,DC= domeinnaamcontainer van Active Directory

Distributed Link Tracking-objecten bevinden zich in de volgende twee tabellen onder de map CN=FileLinks,CN=System:

  • CN=ObjectMoveTable,CN=FileLinks,CN=System,DC= domeinnaam:

Dit object slaat informatie op over gekoppelde bestanden die in het domein zijn verplaatst.

  • CN=VolumeTable,CN=FileLinks,CN=System,DC= domeinnaam:

    Met dit object wordt informatie opgeslagen over elk NTFS-volume in het domein.

Objecten voor het bijhouden van gedistribueerde koppelingen nemen afzonderlijk weinig ruimte in beslag, maar ze kunnen grote hoeveelheden ruimte in Active Directory in beslag nemen wanneer ze zich in de loop van de tijd kunnen ophopen.

Als u Distributed Link Tracking uitschakelt en de Distributed Link Tracking-objecten verwijdert uit Active Directory, kan het volgende gedrag optreden:

  • De grootte van de Active Directory-database kan worden verkleind (dit gedrag treedt op nadat de objecten zijn verwijderd en afval is verzameld, en nadat u een offlinedefragmentatieprocedure hebt uitgevoerd).
  • Replicatieverkeer tussen domeincontrollers kan worden verminderd.

In Windows 2000, Windows XP en Windows Server 2003 is de beginwaarde voor de clientservice Distributed Link Tracking ingesteld op Automatisch. Op Windows 2000-servers wordt de service Distributed Link Tracking Server standaard handmatig gestart. Als u echter Dcpromo.exe gebruikt om een server te promoveren naar een domein, wordt de service Distributed Link Tracking Server geconfigureerd om automatisch te starten.

Voor Windows Server 2003-servers is de service Distributed Link Tracking Server standaard uitgeschakeld. Wanneer u Dcpromo.exe gebruikt om een server te promoveren tot een domein, is de service Distributed Link Tracking Server niet geconfigureerd om automatisch te starten. Wanneer een Windows 2000-domeincontroller wordt bijgewerkt naar Windows Server 2003, wordt de service Distributed Link Tracking Server ook uitgeschakeld tijdens de upgrade. Als u een beheerder bent en u de service Distributed Link Tracking Server wilt gebruiken, moet u groepsbeleid gebruiken of handmatig instellen dat de service automatisch wordt gestart. Bovendien probeert de Distributed Link Tracking Client-service op computers met Windows Server 2003 of Windows XP SP1 niet standaard de Distributed Link Tracking Server-service te gebruiken. Als u deze computers wilt configureren om te profiteren van de service Distributed Link Tracking Server, schakelt u de beleidsinstelling Distributed Link Tracking-clients toestaan om domeinresources te gebruiken in. Open hiervoor het knooppunt Computerconfiguratie/Beheersjablonen/Systeem in groepsbeleid.

Microsoft raadt u aan de volgende instellingen te gebruiken met Distributed Link Tracking op windows 2000-servers:

  1. Schakel de service Distributed Link Tracking Server uit op alle domeincontrollers (dit is de standaardconfiguratie op alle Windows Server 2003-servers).

    Vanwege de overhead van replicatie en de ruimte die FileLinks-tabellen in Active Directory gebruiken, raadt Microsoft aan de service Distributed Link Tracking Server uit te schakelen op Active Directory-domeincontrollers. Gebruik een van de volgende methoden om de service te stoppen:

    • Dubbelklik in de module Services (Services.msc of compmgmt.msc) op de service Distributed Link Tracking Server en klik vervolgens op Uitgeschakeld in het vak Opstarttype .

    • Definieer de opstartwaarde in het knooppunt Computerconfiguratie/Windows-instellingen/Systeemservices van Groepsbeleid.

    • Definieer de beleidsinstellingen voor een organisatie-eenheid die als host fungeert voor alle Windows 2000-domeincontrollers.

    Start de domeincontrollers opnieuw op nadat het beleid is gerepliceerd, zodat het beleid wordt toegepast. Als u de domeincontrollers niet opnieuw start, moet u de service op elke domeincontroller handmatig stoppen.

  2. Verwijder Distributed Link Tracking-objecten van Active Directory-domeincontrollers.

    Zie de sectie 'Distributed Link Tracking Object verwijderen' van dit artikel voor meer informatie over het verwijderen van Distributed Link Tracking-objecten. Het wordt aanbevolen om objecten te verwijderen nadat u de service Distributed Link Tracking Server hebt uitgeschakeld.

    Opmerking

    De grootte van de Directory Information Tree (DIT) op domeincontrollers wordt pas verkleind als de volgende acties zijn voltooid.

    1. Objecten worden verwijderd uit de adreslijstservice.

      Opmerking

      Verwijderde objecten worden opgeslagen in de container Verwijderde objecten totdat de levensduur van de tombstone verloopt. De standaardwaarde voor een tombstone-levensduur is 60 dagen. De minimumwaarde is twee dagen. Standaard is de waarde 180 dagen voor nieuwe forests die samen met Windows Server 2003 Service Pack 1 of een latere versie van Windows Server 2003 worden geïnstalleerd.

      Tenzij u sterke Active Directory-replicatiebewaking hebt, wordt u aangeraden de waarde van 180 dagen te gebruiken. Verminder deze waarde niet om problemen met deze grootte af te handelen. Als u problemen hebt met de grootte van de database, neemt u contact op met de klantenservice van Microsoft.

    2. Garbagecollection is voltooid.

    3. U gebruikt Ntdsutil.exe om het bestand Ntds.dit in de Dsrepair-modus te defragmenteren.

Het is niet essentieel dat u de Distributed Link Tracking-objecten handmatig verwijdert nadat u de Distributed Link Tracking-serverservice hebt gestopt, tenzij u de schijfruimte die door deze objecten wordt verbruikt zo snel mogelijk moet vrijmaken. Clients voor het bijhouden van gedistribueerde koppelingen vragen de Distributed Link Tracking-server om elke 30 dagen koppelingen bij te werken. De service Distributed Link Tracking Server verwijdert objecten die niet zijn bijgewerkt in 90 dagen.

Wanneer u de Dltpurge.vbs VBScript uitvoert, worden alle Active Directory-objecten die worden gebruikt door de Distributed Link Tracking Server-service verwijderd uit het domein waarop het script wordt uitgevoerd. U moet het script uitvoeren op één domeincontroller voor elk domein in een forest. Ga als volgende te werk om Dltpurge.vbs uit te voeren:

  1. Haal het Dltpurge.vbs-script op van Microsoft Productondersteuning.

  2. Stop de service Distributed Link Tracking Server op alle domeincontrollers in het domein waarop Dltpurge.vbs is gericht.

  3. Gebruik beheerdersbevoegdheden om u aan te melden bij de console van een domeincontroller of een lidcomputer in het domein waarop Dltpurge.vbs.

  4. Gebruik de volgende syntaxis om Dltpurge.vbs uit te voeren vanaf een opdrachtregel:

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

    In deze opdrachtregel:

    • -s is de DNS-hostnaam van de domeincontroller waarop u Distributed Link Tracking-objecten wilt verwijderen.
    • -d is het DN-naampad van het domein waarop u Distributed Link Tracking-objecten wilt verwijderen.
  5. Voer een offlinedefragmentatieprocedure uit van het bestand Ntds.dit nadat de objecten zijn gegraven en afval zijn verzameld. Klik op het volgende artikelnummer om het artikel in de Microsoft Knowledge Base weer te geven voor meer informatie over het proces voor het ophalen van afval:

    198793 het proces voor het ophalen van de Active Directory-database

Een voorbeeld van een klantervaring

Het slechtste scenario dat in deze sectie wordt beschreven, illustreert enkele problemen waarmee u rekening moet houden wanneer u een groot aantal Distributed Link Tracking-objecten in een groot productiedomein verwijdert.

Trey Research, een fictieve Fortune 500-klant met meer dan 40.000 werknemers wereldwijd, implementeert één Active Directory-forest dat bestaat uit een leeg hoofddomein met onderliggende domeinen die belangrijke geografische regio's van de wereld toewijzen (Noord-Amerika, Azië, Europa, enzovoort). Het grootste domein in het forest bevat ongeveer 35.000 gebruikersaccounts en hetzelfde aantal computeraccounts.

De Ntds.dit-bestanden zijn geplaatst op raidmatrices van 18 gigabyte (GB). Sinds de eerste implementatie van Windows 2000 zijn de globale catalogusbestanden gegroeid tot 17 GB.

Trey Research wil Windows Server 2003 binnen 10 dagen implementeren, maar heeft ten minste 1,5 GB beschikbare schijfruimte op de databasepartitie nodig voordat de upgrade wordt gestart. Ze hebben zoveel schijfruimte nodig omdat het bekend is dat Adprep.exe drie tot vijf overgenomen azen toevoegt, afhankelijk van de hotfixes en servicepacks die eerder zijn geïnstalleerd. De volgende voorwaarden dragen bij aan de grote globale catalogusgrootte of het gebrek aan schijfruimte:

  • Voorwaarde 1: Trey Research was een early adopter van Windows 2000 en de grootste stations die ze van hun favoriete hardwareleverancier ontvingen, waren 9 GB of 18 GB toen ze werden geconfigureerd in een raid-matrix. De huidige stations zijn het dubbele van de grootte voor de helft van de kosten.

  • Voorwaarde 2: DNS-opruiming is niet ingeschakeld op met Active Directory geïntegreerde DNS-zones die zijn gedelegeerd aan elk domein in het forest.

  • Voorwaarde 3: Domeingebruikers mogen computeraccounts maken in het domein. Beheerders hebben geen terugkerend proces voor het identificeren en verwijderen van zwevende computeraccounts.

  • Voorwaarde 4: In de loop van de tijd zijn beveiligingsdescriptors gedefinieerd door beheerders, servicepacks en hotfixes op hoofden van hoofdnaamgevingscontext (NC) (cn=schema, cn=configuratie, cn= domein) en andere containers die als host fungeren voor duizenden objecten in Active Directory. Bovendien is controle ingeschakeld op dezelfde partities. Wanneer u machtigingen instelt en controle inschakelt voor objecten in Active Directory, neemt de grootte van de database toe. Het hulpprogramma waarmee Windows 2000-forests en -domeinen worden voorbereid voor Op Windows Server 2003 gebaseerde domeincontrollers (Adprep) voegt ook overgenomen aces toe; Daarom moest Trey Research ruimte vrijmaken op het schijfstation voordat het domein werd bijgewerkt.

  • Voorwaarde 5: Trey Research heeft niet regelmatig offline defragmentatieprocedures van Ntds.dit-bestanden uitgevoerd in de Dsrepair-modus.

  • Voorwaarde 6: Toen de container CN=FileLinks,CN=System,DC= domeinnaam in het grootste domein werd beoordeeld, zijn meer dan 700.000 Distributed Link Tracking-objecten aan het licht gekomen. De beveiligingsdescriptor voor elk Distributed Link Tracking-object was ongeveer 2 kilobytes (KB's). Elk van deze voorwaarden is geëvalueerd op zijn bijdrage aan het .dit-bestand van 17 GB:

  • Voorwaarde 1: Trey Research heeft besloten geen nieuwe stations te implementeren vanwege de kosten en de tijd die nodig zou zijn om dit te doen. Bovendien hebben ze de schijfruimte alleen tijdelijk nodig omdat ze verwachtten dat de Active Directory-database zou worden verkleind nadat ze een upgrade naar Windows Server 2003 hebben uitgevoerd en het SIS-proces (Single Instance Store) is voltooid (SIS implementeert een efficiëntere opslag van machtigingen in Active Directory-databases).

  • Voorwaarden 2 en 3: Trey Research besloot dat deze voorwaarden de beste praktijken waren; Zelfs als Trey Research ze zou implementeren, zouden ze echter niet de benodigde resultaten bereiken. Ze hebben besloten dns-opruiming in te schakelen omdat dit eenvoudig kan worden geïmplementeerd.

  • Voorwaarde 4: Trey Research realiseerde zich dat als ze beveiligingsdescriptors en systeemtoegangsbeheerlijsten (SACL's) opnieuw zouden definiëren, ze de resultaten zouden bereiken waarnaar ze op zoek zijn, maar ze besloten dat deze procedure tijdrovend zou zijn om te implementeren totdat ze de groottevermindering, de overhead voor replicatie en, het belangrijkste, de compatibiliteit met programma's en beheer in het labscenario dat de productieomgeving weerspiegelt, grondig kunnen testen.

    Omdat Trey Research Windows 2000 SP2 en enkele hotfixes heeft geïmplementeerd, verwachtten ze dat de incrementele overgenomen aces die door Adprep zijn toegevoegd (aan objecten in het domein NC) zo klein kunnen zijn als 300 mb (MB's). Ze kunnen dit gedrag controleren in een testomgeving die wordt gebruikt om upgrades van het productieforest te testen.

  • Voorwaarde 5: Trey Research realiseerde zich dat als ze een offline defragmentatieprocedure uitvoerden, ze mogelijk geen 'witruimte' in het bestand Ntds.dit kunnen herstellen. Beheerders van Trey Research hebben zelfs een toename in databasegrootte opgemerkt direct nadat ze de offlinedefragmentatieprocedure hebben voltooid. Dit gedrag is opgetreden vanwege een inefficiëntie in de Windows 2000-database-engine; deze engine is verbeterd in Windows Server 2003.

  • Voorwaarde 6: Trey Research was het ermee eens dat de voor de hand liggende actie zou zijn om een eenvoudige bulksgewijs verwijderen van alle Distributed Link Tracking-objecten uit de CN=FileLinks,CN=System,DC= domeinnaamcontainer op een domeincontroller in elk domein in het forest. Ze realiseerden zich echter dat als ze dit zouden doen, er pas extra schijfruimte vrij zou komen als de objecten waren vergraven en afval waren verzameld, en totdat ze een offlinedefragmentatieprocedure op elke domeincontroller in dat domein hadden voltooid. Hoewel de tombstone-levensduurwaarde kan worden ingesteld op waarden van slechts twee dagen, waren verschillende domeincontrollers in het Trey Research-forest offline terwijl ze wachtten op hardware- en software-updates. Als objecten worden gegraven voordat end-to-end-replicatie kan plaatsvinden, kunnen verwijderde objecten opnieuw worden gereanimeerd of kunnen inconsistente gegevens worden gerapporteerd tussen globale catalogusservers in het forest. Om onmiddellijk verlichting te bieden, heeft Trey Research de volgende procedure uitgevoerd:

  1. Ze hebben de standaardbeveiligingsdescriptor voor schemaklasseobjecten voor gedistribueerde koppelingstracering verwijderd en vervangen door één beveiligingsprincipal (gebruikersaccount).
  2. Ze hebben een VBScript-programma geschreven dat alle bestaande beveiligingsdescriptors heeft verwijderd en deze vervolgens vervangen door een expliciete ace voor één beveiligingsprincipal.
  3. Ze hebben Distributed Link Tracking-objecten verwijderd in stappen van 10.000 eenheden met een vertraging van drie uur tussen elke objectverwijdering.
  4. Ze hebben een offlinedefragmentatieprocedure uitgevoerd op elke domeincontroller in het domein nadat alle Distributed Link Tracking-objecten zijn verwijderd. Toen Trey Research de descriptor verwijderde en de defragmentatieprocedure uitvoerde, herstelde de database ongeveer 1,5 GB schijfruimte op alle domeincontrollers in het domein. Deze hoeveelheid ruimte was voldoende om het hulpprogramma Adprep comfortabel uit te voeren en alle Op Windows 2000 gebaseerde domeincontrollers en globale catalogi te upgraden naar Windows Server 2003.

Nadat Trey Research het besturingssysteem had bijgewerkt naar Windows Server 2003, werd er meer schijfruimte vrijgemaakt toen de functie single instance store in Windows Server 2003 de databasegrootte verminderde tot ongeveer 8 GB (u moet een offline defragmentatieprocedure uitvoeren om deze resultaten te verkrijgen). Er is meer ruimte hersteld nadat het TSL-interval is verlopen, Distributed Link Tracking-objecten zijn garbage verzameld en ze hebben een offlinedefragmentatieprocedure uitgevoerd.

Trey Research promootte een nieuwe replica van een Windows 2000-gebaseerde domeincontroller in het domein en plaatste het computeraccount in een andere organisatie-eenheid dan gewoonlijk werd gebruikt. In twee dagen waren er ongeveer 8000 Distributed Link Tracking-objecten aanwezig op de Windows 2000-domeincontroller. Trey Research heeft het bijhouden van gedistribueerde koppelingen gestopt of een beleid gemaakt om de service te stoppen en het beleid vervolgens gekoppeld aan organisatie-eenheden die op Windows 2000 gebaseerde domeincontrollers hosten. Ten slotte heeft Trey Research Dltpurge.vbs gebruikt om de resterende Distributed Link Tracking-objecten te markeren voor verwijdering.

Anatomie van DLT-objectverwijdering

DLT-objecten zelf bevatten weinig kenmerken en gebruiken weinig ruimte in Active Directory. Wanneer een object is gemarkeerd voor verwijdering (tombstoned), worden alle onnodige kenmerken verwijderd, met uitzondering van de kenmerken die nodig zijn om het object te volgen totdat het wordt verwijderd uit Active Directory.

In het geval van de objecten voor het bijhouden van koppelingen, komt het markeren van het object voor verwijdering er slechts op neer dat er twee kenmerken worden verwijderd: dscorepropagationdata en objectcategory. Het verwijderen van de twee kenmerken resulteert in een eerste besparing van 34 bytes. Tijdens het markeren van het object voor het bijhouden van koppelingen voor verwijdering wordt het object echter ook bijgewerkt door een IS_DELETED-kenmerk (4 bytes) toe te voegen en door de RDN- en de algemene naamkenmerken te beheren, waardoor elk van deze kenmerken met ongeveer 80 bytes groeit. Daarnaast wordt het kenmerk replicatiemetagegevens ook met ongeveer 50 bytes uitgebreid om de updates weer te geven die op dit object zijn uitgevoerd. Als u een object voor het bijhouden van koppelingen markeert voor verwijdering, groeit het object uiteindelijk met ongeveer 200 bytes. De NTDS. DIT zal geen vermindering in grootte vertonen totdat de verwijderde objecten tombstoned zijn, afval zijn verzameld en een offline defragmentatie is uitgevoerd.

Opmerking

Als de service is uitgeschakeld zoals in dit artikel wordt aanbevolen, wordt automatisch opschonen niet uitgevoerd.

Tekstversie van Dltpurge.vbs

Ga als volgt te werk om dit script te gebruiken:

  1. Kopieer alle tekst tussen de <tag Hier> kopiëren starten en de <tag Kopieer hier> beëindigen in dit artikel en plak de tekst vervolgens in een ASCII-teksteditorbestand (bijvoorbeeld een Microsoft Kladblok-bestand).
  2. Sla het bestand op als 'Dltpurge.vbs'. 3 Voltooi de procedure die wordt beschreven in Distributed Link Tracking-objecten verwijderen
<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>