Suivi des liens distribués sur les contrôleurs de domaine Windows

Cet article décrit comment utiliser les services Distributed Link Tracking dans Windows pour suivre la création et le déplacement de fichiers liés sur des volumes et des serveurs au format NTFS.

S’applique à : Windows Server 2012 R2
Numéro de la base de connaissances d’origine : 312403

Vous pouvez utiliser le service Distributed Link Tracking Server et le service Distributed Link Tracking Client pour effectuer le suivi des liens vers des fichiers sur des partitions au format NTFS. Distributed Link Tracking suit les liens dans les scénarios où le lien est établi vers un fichier sur un volume NTFS, comme les raccourcis shell et les liens OLE. Si ce fichier est renommé, déplacé vers un autre volume sur le même ordinateur, déplacé vers un autre ordinateur ou déplacé dans d’autres scénarios similaires, Windows utilise Distributed Link Tracking pour rechercher le fichier. Lorsque vous accédez à un lien qui a été déplacé, distributed link tracking localise le lien ; vous n’êtes pas au courant que le fichier a été déplacé ou que Distributed Link Tracking est utilisé pour rechercher le fichier déplacé.

Distributed Link Tracking se compose d’un service client et d’un service serveur. Le service Distributed Link Tracking Server s’exécute exclusivement sur les contrôleurs de domaine Windows Server. Il stocke des informations dans Active Directory et fournit des services pour aider le service distributed link tracking client. Le service Distributed Link Tracking Client s’exécute sur tous les ordinateurs Windows 2000 et Microsoft Windows XP, y compris ceux qui se trouvent dans des environnements de groupe de travail ou ceux qui ne se trouvent pas dans un groupe de travail. Il fournit la seule interaction avec les serveurs Distributed Link Tracking.

Les clients Distributed Link Tracking fournissent occasionnellement au service Distributed Link Tracking Server des informations sur les liens de fichiers, que le service Distributed Link Tracking Server stocke dans Active Directory. Les clients Distributed Link Tracking peuvent également interroger le service Distributed Link Tracking Server pour obtenir ces informations lorsqu’un raccourci shell ou un lien OLE ne peut pas être résolu. Les clients Distributed Link Tracking invitent le serveur Distributed Link Tracking à mettre à jour les liens tous les 30 jours. Le service Distributed Link Tracking Server analyse les objets qui n’ont pas été mis à jour depuis 90 jours

Lorsqu’un fichier référencé par un lien est déplacé vers un autre volume (sur le même ordinateur ou sur un autre ordinateur), le client Distributed Link Tracking avertit le serveur Distributed Link Tracking, qui crée un objet linkTrackOMTEntry dans Active Directory. Un objet linkTrackVolEntry est créé dans Active Directory pour chaque volume NTFS du domaine.

Remarque

Dans Windows Server 2008 et versions ultérieures, le service distributed link tracking server n’est plus inclus dans Windows. Vous pouvez donc supprimer les objets d’Active Directory en toute sécurité.

Les objets Distributed Link Tracking sont répliqués entre tous les contrôleurs de domaine du domaine qui héberge le compte d’ordinateur et tous les serveurs de catalogue global dans la forêt. Le service Distributed Link Tracking Server crée des objets dans le chemin d’accès de nom unique suivant :

CN=FileLinks,CN=System,DC= conteneur de noms de domaine d’Active Directory

Les objets Distributed Link Tracking existent dans les deux tables suivantes sous le dossier CN=FileLinks,CN=System :

  • CN=ObjectMoveTable,CN=FileLinks,CN=System,DC= nom de domaine :

Cet objet stocke des informations sur les fichiers liés qui ont été déplacés dans le domaine.

  • CN=VolumeTable,CN=FileLinks,CN=System,DC= nom de domaine :

    Cet objet stocke des informations sur chaque volume NTFS dans le domaine.

Les objets Distributed Link Tracking consomment peu d’espace individuellement, mais ils peuvent consommer de grandes quantités d’espace dans Active Directory lorsqu’ils sont autorisés à s’accumuler au fil du temps.

Si vous désactivez le suivi des liens distribués et supprimez les objets Distributed Link Tracking d’Active Directory, le comportement suivant peut se produire :

  • La taille de la base de données Active Directory peut être réduite (ce comportement se produit une fois que les objets ont été supprimés et récupérés par la mémoire, et après que vous avez effectué une procédure de défragmentation hors connexion).
  • Le trafic de réplication entre les contrôleurs de domaine peut être réduit.

Dans Windows 2000, Windows XP et Windows Server 2003, la valeur de début du service Distributed Link Tracking Client est définie sur Automatique. Sur les serveurs Windows 2000, le service Distributed Link Tracking Server démarre manuellement, par défaut. Toutefois, si vous utilisez Dcpromo.exe pour promouvoir un serveur en domaine, le service Serveur de suivi de liens distribués est configuré pour démarrer automatiquement.

Pour les serveurs Windows Server 2003, le service Distributed Link Tracking Server est désactivé par défaut. Lorsque vous utilisez Dcpromo.exe pour promouvoir un serveur en domaine, le service Distributed Link Tracking Server n’est pas configuré pour démarrer automatiquement. Lorsqu’un contrôleur de domaine Windows 2000 est mis à niveau vers Windows Server 2003, le service Distributed Link Tracking Server est également désactivé pendant la mise à niveau. Si vous êtes administrateur et que vous souhaitez utiliser le service Distributed Link Tracking Server, vous devez utiliser stratégie de groupe ou configurer manuellement le service pour qu’il démarre automatiquement. En outre, le service Distributed Link Tracking Client sur les ordinateurs qui exécutent Windows Server 2003 ou Windows XP SP1 n’essaie pas d’utiliser le service Distributed Link Tracking Server par défaut. Si vous souhaitez configurer ces ordinateurs pour tirer parti du service Distributed Link Tracking Server, activez le paramètre de stratégie Autoriser les clients distributed Link Tracking à utiliser les ressources de domaine. Pour ce faire, ouvrez le nœud Configuration ordinateur/Modèles d’administration/Système dans stratégie de groupe.

Microsoft vous recommande d’utiliser les paramètres suivants avec Distributed Link Tracking sur les serveurs Windows 2000 :

  1. Désactivez le service Distributed Link Tracking Server sur tous les contrôleurs de domaine (il s’agit de la configuration par défaut sur tous les serveurs Windows Server 2003).

    En raison de la surcharge de réplication et de l’espace utilisé par les tables FileLinks dans Active Directory, Microsoft vous recommande de désactiver le service Distributed Link Tracking Server sur les contrôleurs de domaine Active Directory. Pour arrêter le service, utilisez l’une des méthodes suivantes :

    • Dans le composant logiciel enfichable Services (Services.msc ou compmgmt.msc), double-cliquez sur le service Serveur de suivi de liens distribués , puis cliquez sur Désactivé dans la zone Type de démarrage .

    • Définissez la valeur de démarrage dans le nœud Configuration ordinateur/Paramètres Windows/Services système de la stratégie de groupe.

    • Définissez les paramètres de stratégie sur une unité d’organisation qui héberge tous les contrôleurs de domaine Windows 2000.

    Redémarrez les contrôleurs de domaine une fois la stratégie répliquée afin que la stratégie soit appliquée. Si vous ne redémarrez pas les contrôleurs de domaine, vous devez arrêter manuellement le service sur chaque contrôleur de domaine.

  2. Supprimez les objets Distributed Link Tracking des contrôleurs de domaine Active Directory.

    Consultez la section « How to Delete Distributed Link Tracking Object » de cet article pour plus d’informations sur la suppression d’objets Distributed Link Tracking. Il est recommandé de supprimer les objets après avoir désactivé le service Distributed Link Tracking Server.

    Remarque

    La taille de l’arborescence d’informations sur les contrôleurs de domaine n’est pas réduite tant que les actions suivantes ne sont pas terminées.

    1. Les objets sont supprimés du service d’annuaire.

      Remarque

      Les objets supprimés sont stockés dans le conteneur Objets supprimés jusqu’à l’expiration de la durée de vie de la pierre tombstone. La valeur par défaut pour une durée de vie tombstone est de 60 jours. La valeur minimale est de deux jours. Par défaut, la valeur est de 180 jours pour les nouvelles forêts installées avec Windows Server 2003 Service Pack 1 ou une version ultérieure de Windows Server 2003.

      Sauf si vous disposez d’une supervision forte de la réplication Active Directory, nous vous recommandons d’utiliser la valeur de 180 jours. Ne réduisez pas cette valeur pour gérer les problèmes de taille DIT. Si vous rencontrez des problèmes de taille de base de données, contactez le service de support technique Microsoft.

    2. Le nettoyage de la mémoire s’est terminé.

    3. Vous utilisez Ntdsutil.exe pour défragmenter le fichier Ntds.dit en mode Dsrepair.

Il n’est pas essentiel de supprimer manuellement les objets Distributed Link Tracking après avoir arrêté le service serveur Distributed Link Tracking, sauf si vous devez récupérer l’espace disque consommé par ces objets aussi rapidement que possible. Les clients Distributed Link Tracking invitent le serveur Distributed Link Tracking à mettre à jour les liens tous les 30 jours. Le service Distributed Link Tracking Server analyse les objets qui n’ont pas été mis à jour depuis 90 jours.

Lorsque vous exécutez le Dltpurge.vbs VBScript, tous les objets Active Directory utilisés par le service Distributed Link Tracking Server sont supprimés du domaine dans lequel le script est exécuté. Vous devez exécuter le script sur un contrôleur de domaine pour chaque domaine d’une forêt. Pour exécuter Dltpurge.vbs :

  1. Obtenez le script Dltpurge.vbs auprès du support technique Microsoft.

  2. Arrêtez le service Distributed Link Tracking Server sur tous les contrôleurs de domaine du domaine ciblé par Dltpurge.vbs.

  3. Utilisez les privilèges d’administrateur pour vous connecter à la console d’un contrôleur de domaine ou à un ordinateur membre dans le domaine ciblé par Dltpurge.vbs.

  4. Utilisez la syntaxe suivante pour exécuter Dltpurge.vbs à partir d’une ligne de commande :

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

    Dans cette ligne de commande :

    • -s est le nom d’hôte DNS du contrôleur de domaine sur lequel vous souhaitez supprimer les objets Distributed Link Tracking.
    • -d est le chemin du nom unique du domaine sur lequel vous souhaitez supprimer des objets Distributed Link Tracking.
  5. Effectuez une procédure de défragmentation hors connexion du fichier Ntds.dit après que les objets ont été supprimés et récupérés par la mémoire. Pour plus d’informations sur le processus de garbage collection, cliquez sur le numéro d’article suivant pour afficher l’article dans la Base de connaissances Microsoft :

    198793 Le processus de garbage collection de base de données Active Directory

Exemple d’expérience client

Le scénario le plus défavorable décrit dans cette section illustre certains problèmes à prendre en compte lorsque vous supprimez un grand nombre d’objets Distributed Link Tracking dans un domaine de production volumineux.

Trey Research, un client fortune 500 fictif avec plus de 40 000 employés dans le monde entier déploie une forêt Active Directory unique qui se compose d’un domaine racine vide avec des domaines enfants qui mappent les principales régions géographiques du monde (Amérique du Nord, Asie, Europe, etc.). Le plus grand domaine de la forêt contient environ 35 000 comptes d’utilisateur et le même nombre de comptes d’ordinateur.

Les fichiers Ntds.dit ont été placés sur des tableaux raid de 18 gigaoctets (Go). Depuis le déploiement initial de Windows 2000, les fichiers catalogue globaux sont passés à 17 Go.

Trey Research souhaite déployer Windows Server 2003 dans les 10 prochains jours, mais a besoin d’au moins 1,5 Go d’espace disque disponible sur la partition de base de données avant de lancer la mise à niveau. Ils ont besoin de cette quantité d’espace disque, car Adprep.exe est connu pour ajouter trois à cinq as hérités en fonction des correctifs logiciels et des Service Packs qui ont été installés précédemment. Les conditions suivantes contribuent à la grande taille du catalogue global ou au manque d’espace disque :

  • Condition 1 : Trey Research a été l’un des premiers utilisateurs de Windows 2000 et les plus grands lecteurs reçus de leur fournisseur de matériel préféré étaient de 9 Go ou 18 Go lorsqu’ils ont été configurés dans un tableau raid. La taille des lecteurs actuels est deux fois supérieure à la moitié du coût.

  • Condition 2 : Le nettoyage DNS n’a pas été activé sur les zones DNS intégrées à Active Directory qui ont été déléguées à chaque domaine de la forêt.

  • Condition 3 : les utilisateurs de domaine étaient autorisés à créer des comptes d’ordinateur dans le domaine. Les administrateurs n’avaient pas de processus périodique pour identifier et supprimer les comptes d’ordinateur orphelins.

  • Condition 4 : Au fil du temps, les descripteurs de sécurité ont été définis par les administrateurs, les Service Packs et les correctifs logiciels sur les têtes de contexte de nommage racine (NC) (cn=schema, cn=configuration, cn= domaine) et d’autres conteneurs qui hébergent des milliers d’objets dans Active Directory. En outre, l’audit a été activé sur les mêmes partitions. Lorsque vous définissez des autorisations et activez l’audit sur les objets dans Active Directory, la taille de la base de données augmente. L’outil qui prépare les forêts et domaines Windows 2000 pour les contrôleurs de domaine Windows Server 2003 (Adprep) ajoute également des as hérités ; Par conséquent, Trey Research devait libérer de l’espace sur le lecteur de disque avant de mettre à niveau le domaine.

  • Condition 5 : Trey Research n’a pas effectué régulièrement de procédures de défragmentation hors connexion des fichiers Ntds.dit en mode Dsrepair.

  • Condition 6 : Lorsque le conteneur CN=FileLinks,CN=System,DC= domain name dans le domaine le plus grand a été examiné, il a révélé plus de 700 000 objets Distributed Link Tracking. Le descripteur de sécurité sur chaque objet Distributed Link Tracking était d’environ 2 kilo-octets (Ko). Chacune de ces conditions a été évaluée pour sa contribution au fichier .dit de 17 Go :

  • Condition 1 : Trey Research a décidé de ne pas déployer de nouveaux lecteurs en raison du coût et du temps qu’il faudrait pour le faire. En outre, ils n’avaient besoin que temporairement de l’espace disque, car ils s’attendaient à ce que la base de données Active Directory diminue après la mise à niveau vers Windows Server 2003 et la fin du processus du magasin d’instances uniques (SIS implémente un stockage plus efficace des autorisations dans les bases de données Active Directory).

  • Conditions 2 et 3 : Trey Research a décidé que ces conditions étaient les meilleures pratiques; Cependant, même si Trey Research les met en œuvre, ils n’obtiendraient pas les résultats nécessaires. Ils ont décidé d’activer le nettoyage DNS, car il est facilement implémenté.

  • Condition 4 : Trey Research s’est rendu compte que s’ils redéfinissaient les descripteurs de sécurité et les listes de contrôle d’accès système (SACL), ils obtiendraient les résultats qu’ils recherchent, mais ils ont décidé que cette procédure serait longue à implémenter jusqu’à ce qu’ils puissent tester minutieusement la réduction de la taille, la surcharge de réplication et, plus important encore, la compatibilité programme/administration dans le scénario de laboratoire qui reflète l’environnement de production.

    Étant donné que Trey Research a déployé Windows 2000 SP2 et quelques correctifs logiciels, il s’attendait à ce que les as hérités incrémentiels ajoutés par Adprep (aux objets dans le domaine NC) puissent être aussi petits que 300 mégaoctets (Mo). Ils peuvent vérifier ce comportement dans un environnement lab utilisé pour tester les mises à niveau de la forêt de production.

  • Condition 5 : Trey Research s’est rendu compte que s’ils effectuaient une procédure de défragmentation hors connexion, ils pourraient ne pas récupérer les « espaces blancs » dans le fichier Ntds.dit. En fait, les administrateurs de Trey Research ont remarqué une augmentation de la taille de la base de données immédiatement après avoir terminé la procédure de défragmentation hors connexion. Ce comportement s’est produit en raison d’une inefficacité dans le moteur de base de données Windows 2000 ; ce moteur est amélioré dans Windows Server 2003.

  • Condition 6 : Trey Research a convenu que la ligne de conduite évidente consisterait à effectuer une simple suppression en bloc de tous les objets Distributed Link Tracking du conteneur CN=FileLinks,CN=System,DC= domain name sur un contrôleur de domaine dans chaque domaine de la forêt. Toutefois, ils se sont rendu compte que s’ils le faisaient, l’espace disque supplémentaire ne serait pas libéré tant que les objets n’avaient pas été supprimés et récupérés de la mémoire, et jusqu’à ce qu’ils aient terminé une procédure de défragmentation hors connexion sur chaque contrôleur de domaine dans ce domaine. Bien que la valeur de durée de vie de la pierre tombstone puisse être définie sur des valeurs aussi basses que deux jours, plusieurs contrôleurs de domaine dans la forêt Trey Research étaient hors connexion car ils attendaient des mises à jour matérielles et logicielles. Si les objets sont supprimés avant la réplication de bout en bout, les objets supprimés peuvent être réanimés ou des données incohérentes peuvent être signalées entre les serveurs de catalogues globaux de la forêt. Pour fournir un soulagement immédiat, Trey Research a effectué la procédure suivante :

  1. Ils ont supprimé le descripteur de sécurité par défaut pour les objets de classe de schéma Distributed Link Tracking et l’ont remplacé par un seul principal de sécurité (compte d’utilisateur).
  2. Ils ont écrit un programme VBScript qui supprimait tous les descripteurs de sécurité existants, puis les remplaçait par un as explicite pour un seul principal de sécurité.
  3. Ils ont supprimé des objets Distributed Link Tracking par incréments de 10 000 unités avec un délai de trois heures entre chaque suppression d’objet.
  4. Ils ont effectué une procédure de défragmentation hors connexion sur chaque contrôleur de domaine du domaine après la suppression de tous les objets Distributed Link Tracking. Lorsque Trey Research a supprimé le descripteur et effectué la procédure de défragmentation, la base de données a récupéré environ 1,5 Go d’espace disque sur tous les contrôleurs de domaine du domaine. Cette quantité d’espace était suffisante pour exécuter confortablement l’outil Adprep et mettre à niveau tous les contrôleurs de domaine windows 2000 et catalogues globaux vers Windows Server 2003.

Après la mise à niveau du système d’exploitation par Trey Research vers Windows Server 2003, davantage d’espace disque a été libéré lorsque la fonctionnalité de magasin de instance unique dans Windows Server 2003 a réduit la taille de la base de données à environ 8 Go (vous devez effectuer une procédure de défragmentation hors connexion pour obtenir ces résultats). Plus d’espace a été récupéré après l’expiration de l’intervalle TSL, les objets Distributed Link Tracking ont été récupérés par la mémoire et ils ont effectué une procédure de défragmentation hors connexion.

Trey Research a promu une nouvelle réplica contrôleur de domaine Windows 2000 dans le domaine et placé le compte d’ordinateur dans une unité organisationnelle différente de celle utilisée habituellement. En deux jours, environ 8 000 objets Distributed Link Tracking étaient présents sur le contrôleur de domaine Windows 2000. Trey Research a arrêté Distributed Link Tracking ou créé une stratégie pour arrêter le service, puis lié la stratégie à des unités organisationnelles qui hébergent des contrôleurs de domaine Windows 2000. Enfin, Trey Research a utilisé Dltpurge.vbs pour marquer les objets Distributed Link Tracking restants en vue de leur suppression.

Anatomie de la suppression d’objets DLT

Les objets DLT eux-mêmes contiennent peu d’attributs et utilisent peu d’espace dans Active Directory. Lorsqu’un objet est marqué pour suppression (tombstoned), tous les attributs inutiles sont supprimés, à l’exception de ceux nécessaires pour suivre l’objet jusqu’à ce qu’il soit vidé d’Active Directory.

Dans le cas des objets de suivi de liens, le marquage de l’objet pour suppression équivaut uniquement à deux attributs supprimés : dscorepropagationdata et objectcategory. La suppression des deux attributs entraîne une économie initiale de 34 octets. Toutefois, le processus de marquage de l’objet de suivi des liens pour suppression met également à jour l’objet en ajoutant un attribut IS_DELETED (4 octets) et en maniant les attributs RDN et « common name », ce qui entraîne une augmentation de chacun de ces attributs d’environ 80 octets. En outre, l’attribut « métadonnées de réplication » augmente également d’environ 50 octets pour refléter les mises à jour effectuées sur cet objet. Ainsi, en marquant un objet de suivi de lien pour suppression, l’objet finit par augmenter d’environ 200 octets. The NTDS. DIT ne présente pas de réduction de taille tant que les objets supprimés n’ont pas été supprimés, récupérés par la mémoire et qu’une défragmentation hors connexion n’a pas été effectuée.

Remarque

Si le service est désactivé comme le recommande cet article, le nettoyage automatique ne se produit pas.

Version texte de Dltpurge.vbs

Pour utiliser ce script :

  1. Copiez tout le texte entre la <balise Start Copy Here> et la <balise End Copy Here> dans cet article, puis collez le texte dans un fichier d’éditeur de texte ASCII (par exemple, un fichier Du Bloc-notes Microsoft).
  2. Enregistrez le fichier sous « Dltpurge.vbs ». 3 Effectuez la procédure décrite dans Comment supprimer des objets Distributed Link Tracking
<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>