Controle de link distribuído em controladores de domínio baseados no Windows

Este artigo descreve como você pode usar os serviços de Acompanhamento de Link Distribuído no Windows para acompanhar a criação e a movimentação de arquivos vinculados em volumes e servidores formatados pelo NTFS.

Aplica-se a: Windows Server 2012 R2
Número de KB original: 312403

Você pode usar o serviço Servidor de Acompanhamento de Link Distribuído e o serviço Cliente de Acompanhamento de Link Distribuído para rastrear links para arquivos em partições formatadas pelo NTFS. O Controle de Link Distribuído rastreia links em cenários em que o link é feito para um arquivo em um volume NTFS, como atalhos de shell e links OLE. Se esse arquivo for renomeado, movido para outro volume no mesmo computador, movido para outro computador ou movido em outros cenários semelhantes, o Windows usará o Acompanhamento de Link Distribuído para localizar o arquivo. Quando você acessa um link movido, o Controle de Link Distribuído localiza o link; você não sabe se o arquivo foi movido ou que o Rastreamento de Link Distribuído é usado para localizar o arquivo movido.

O Acompanhamento de Link Distribuído consiste em um serviço cliente e um serviço de servidor. O serviço Servidor de Acompanhamento de Link Distribuído é executado exclusivamente em controladores de domínio baseados no Windows Server. Ele armazena informações no Active Directory e fornece serviços para ajudar o serviço cliente de rastreamento de link distribuído. O serviço Cliente de Acompanhamento de Link Distribuído é executado em todos os computadores baseados em Windows 2000 e Microsoft Windows XP, incluindo aqueles em ambientes de grupo de trabalho ou aqueles que não estão em um grupo de trabalho. Ele fornece a única interação com servidores de Acompanhamento de Link Distribuído.

Os clientes de Acompanhamento de Link Distribuído ocasionalmente fornecem o serviço Servidor de Acompanhamento de Link Distribuído com informações sobre links de arquivo, que o Serviço de Acompanhamento de Link Distribuído armazena no Active Directory. Os clientes de Acompanhamento de Link Distribuído também podem consultar o serviço servidor de rastreamento de link distribuído para obter essas informações quando um atalho de shell ou um link OLE não puder ser resolvido. Os clientes de Acompanhamento de Link Distribuído solicitam que o servidor de Acompanhamento de Link Distribuído atualize os links a cada 30 dias. O serviço servidor de rastreamento de link distribuído armazena objetos que não foram atualizados há 90 dias

Quando um arquivo referenciado por um link é movido para outro volume (no mesmo computador ou em um computador diferente), o cliente de Acompanhamento de Link Distribuído notifica o servidor de Acompanhamento de Link Distribuído, que cria um objeto linkTrackOMTEntry no Active Directory. Um objeto linkTrackVolEntry é criado no Active Directory para cada volume NTFS no domínio.

Observação

No Windows Server 2008 e mais recente, o Serviço de Servidor de Rastreamento de Link Distribuído não está mais incluído no Windows. Para que você possa remover com segurança os objetos do Active Directory.

Objetos de rastreamento de link distribuídos são replicados entre todos os controladores de domínio no domínio que está hospedando a conta do computador e todos os servidores de catálogo globais na floresta. O serviço Servidor de Acompanhamento de Link Distribuído cria objetos no seguinte caminho de nome distinto:

Contêiner de nome de domínio CN=FileLinks,CN=System,DC= do Active Directory

Objetos de acompanhamento de link distribuídos existem nas duas tabelas a seguir na pasta CN=FileLinks,CN=System:

  • CN=ObjectMoveTable,CN=FileLinks,CN=System,DC= nome de domínio:

Esse objeto armazena informações sobre arquivos vinculados que foram movidos no domínio.

  • CN=VolumeTable,CN=FileLinks,CN=System,DC= nome de domínio:

    Esse objeto armazena informações sobre cada volume NTFS no domínio.

Objetos de Acompanhamento de Link Distribuído consomem pouco espaço individualmente, mas podem consumir grandes quantidades de espaço no Active Directory quando podem se acumular ao longo do tempo.

Se você desabilitar o Controle de Link Distribuído e excluir os objetos de Acompanhamento de Link Distribuído do Active Directory, o seguinte comportamento poderá ocorrer:

  • O tamanho do banco de dados do Active Directory pode ser reduzido (esse comportamento ocorre depois que os objetos foram tombados e o lixo coletado, e depois de executar um procedimento de desfragmentação offline).
  • O tráfego de replicação entre controladores de domínio pode ser reduzido.

No Windows 2000, Windows XP e Windows Server 2003, o valor inicial do serviço Cliente de Acompanhamento de Link Distribuído é definido como Automático. Em servidores baseados no Windows 2000, o serviço servidor de rastreamento de link distribuído começa manualmente, por padrão. No entanto, se você usar Dcpromo.exe para promover um servidor para um domínio, o serviço Servidor de Acompanhamento de Link Distribuído será configurado para iniciar automaticamente.

Para servidores baseados no Windows Server 2003, o serviço servidor de rastreamento de link distribuído é desabilitado por padrão. Quando você usa Dcpromo.exe para promover um servidor para um domínio, o serviço servidor de rastreamento de link distribuído não é configurado para iniciar automaticamente. Quando um controlador de domínio baseado no Windows 2000 é atualizado para o Windows Server 2003, o serviço Servidor de Acompanhamento de Link Distribuído também é desabilitado durante a atualização. Se você for um administrador e quiser usar o serviço Servidor de Acompanhamento de Link Distribuído, use Política de Grupo ou defina manualmente o serviço para iniciar automaticamente. Além disso, o serviço Cliente de Acompanhamento de Link Distribuído em computadores que estão executando o Windows Server 2003 ou Windows XP SP1 não tenta usar o serviço servidor de rastreamento de link distribuído por padrão. Se você quiser configurar esses computadores para aproveitar o serviço do Servidor de Acompanhamento de Link Distribuído, habilite a configuração permitir que clientes de rastreamento de link distribuído usem a configuração de política de recursos de domínio. Para fazer isso, abra o nó Configuração do Computador/Modelos Administrativos/Sistema no Política de Grupo.

A Microsoft recomenda que você use as seguintes configurações com o Controle de Link Distribuído em servidores baseados no Windows 2000:

  1. Desative o serviço Servidor de Acompanhamento de Link Distribuído em todos os controladores de domínio (essa é a configuração padrão em todos os servidores baseados no Windows Server 2003).

    Devido à sobrecarga de replicação e ao espaço que as tabelas FileLinks usam no Active Directory, a Microsoft recomenda que você desative o serviço servidor de rastreamento de link distribuído em controladores de domínio do Active Directory. Para interromper o serviço, use qualquer um dos seguintes métodos:

    • No snap-in serviços (Services.msc ou compmgmt.msc), clique duas vezes no serviço Servidor de Acompanhamento de Link Distribuído e clique em Desabilitado na caixa Tipo de inicialização .

    • Defina o valor de inicialização no nó Configuração do Computador/Configurações do Windows/Serviços do Sistema da política de grupo.

    • Defina as configurações de política em uma unidade organizacional que hospeda todos os controladores de domínio do Windows 2000.

    Reinicie os controladores de domínio após a replicação da política para que a política seja aplicada. Se você não reiniciar os controladores de domínio, precisará interromper manualmente o serviço em cada controlador de domínio.

  2. Excluir objetos de acompanhamento de link distribuído de controladores de domínio do Active Directory.

    Consulte a seção "Como excluir o objeto de rastreamento de link distribuído" deste artigo para obter mais informações sobre como excluir objetos de Rastreamento de Link Distribuído. É recomendável excluir objetos depois de desabilitar o serviço servidor de rastreamento de link distribuído.

    Observação

    O tamanho da DIT (Árvore de Informações de Diretório) em controladores de domínio não é reduzido até que as ações a seguir sejam concluídas.

    1. Os objetos são excluídos do serviço de diretório.

      Observação

      Objetos excluídos são armazenados no contêiner Objetos Excluídos até que o tempo de vida da lápide expire. O valor padrão para um tempo de vida de lápide é de 60 dias. O valor mínimo é de dois dias. Por padrão, o valor é de 180 dias para novas florestas instaladas junto com o Windows Server 2003 Service Pack 1 ou uma versão posterior do Windows Server 2003.

      A menos que você tenha um forte monitoramento de replicação do Active Directory, recomendamos que você use o valor de 180 dias. Não reduza esse valor para lidar com problemas de tamanho DIT. Se você tiver problemas com o tamanho do banco de dados, entre em contato com os Serviços de Suporte ao Cliente da Microsoft.

    2. A coleta de lixo foi executada até a conclusão.

    3. Você usa Ntdsutil.exe para desfragmentar o arquivo Ntds.dit no modo Dsrepair.

Não é fundamental que você exclua manualmente os objetos de Rastreamento de Link Distribuído depois de interromper o serviço de servidor de Rastreamento de Link Distribuído, a menos que seja necessário recuperar o espaço em disco que está sendo consumido por esses objetos o mais rápido possível. Os clientes de Acompanhamento de Link Distribuído solicitam que o servidor de Acompanhamento de Link Distribuído atualize os links a cada 30 dias. O serviço servidor de rastreamento de link distribuído armazena objetos que não são atualizados há 90 dias.

Quando você executa o VBScript Dltpurge.vbs, todos os objetos do Active Directory usados pelo serviço servidor de rastreamento de link distribuído são excluídos do domínio em que o script é executado. Você deve executar o script em um controlador de domínio para cada domínio em uma floresta. Para executar Dltpurge.vbs:

  1. Obtenha o script Dltpurge.vbs do Suporte ao Produto da Microsoft.

  2. Interrompa o serviço servidor de rastreamento de link distribuído em todos os controladores de domínio no domínio que está sendo direcionado por Dltpurge.vbs.

  3. Use privilégios de administrador para fazer logon no console de um controlador de domínio ou de um computador membro no domínio que está sendo alvo de Dltpurge.vbs.

  4. Use a seguinte sintaxe para executar Dltpurge.vbs de uma linha de comando:

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

    Nesta linha de comando:

    • -s é o nome do host DNS do controlador de domínio no qual você deseja excluir objetos de Rastreamento de Link Distribuído.
    • -d é o caminho de nome distinto do domínio no qual você deseja excluir objetos de Rastreamento de Link Distribuído.
  5. Execute um procedimento de desfragmentação offline do arquivo Ntds.dit depois que os objetos tiverem sido tombados e o lixo coletado. Para obter mais informações sobre o processo de coleta de lixo, clique no seguinte número de artigo para exibir o artigo na Base de Dados de Conhecimento da Microsoft:

    198793 o processo de coleta de lixo do banco de dados do Active Directory

Uma experiência de cliente de exemplo

O pior cenário descrito nesta seção ilustra alguns problemas a serem considerados quando você exclui um grande número de objetos de Rastreamento de Link Distribuído em um domínio de produção grande.

A Trey Research, um cliente fictício da Fortune 500 com mais de 40.000 funcionários em todo o mundo, implanta uma única floresta do Active Directory que consiste em um domínio raiz vazio com domínios filho que mapeiam as principais regiões geográficas do mundo (América do Norte, Ásia, Europa e assim por diante). O maior domínio da floresta contém cerca de 35.000 contas de usuário e o mesmo número de contas de computador.

Os arquivos Ntds.dit foram colocados em matrizes de ataque de 18 gigabytes (GB). Desde a implantação inicial do Windows 2000, os arquivos do catálogo global cresceram para 17 GB.

A Trey Research deseja implantar o Windows Server 2003 nos próximos 10 dias, mas precisa de pelo menos 1,5 GB de espaço em disco disponível na partição do banco de dados antes de iniciar a atualização. Eles precisam desse espaço em disco porque Adprep.exe é conhecido por adicionar de três a cinco ases herdados, dependendo dos hotfixes e pacotes de serviço que foram instalados anteriormente. As seguintes condições contribuem para o grande tamanho do catálogo global ou a falta de espaço em disco:

  • Condição 1: o Trey Research foi um dos primeiros adotantes do Windows 2000 e as maiores unidades recebidas de seu fornecedor de hardware preferencial eram de 9 GB ou 18 GB quando foram configuradas em uma matriz de raid. As unidades atuais são o dobro do tamanho para metade do custo.

  • Condição 2: a limpeza de DNS não estava habilitada em zonas DNS integradas ao Active Directory que eram delegadas a cada domínio na floresta.

  • Condição 3: os usuários de domínio foram autorizados a criar contas de computador no domínio. Os administradores não tinham um processo recorrente para identificar e excluir contas de computador órfãs.

  • Condição 4: Ao longo do tempo, os descritores de segurança foram definidos por administradores, pacotes de serviço e hotfixes em cabeças NC (contexto de nomenclatura raiz) (cn=schema, cn=configuration, domínio cn=) e outros contêineres que hospedam milhares de objetos no Active Directory. Além disso, a auditoria foi habilitada nas mesmas partições. Quando você define permissões e habilita a auditoria em objetos no Active Directory, o tamanho do banco de dados aumenta. A ferramenta que prepara florestas e domínios do Windows 2000 para controladores de domínio baseados no Windows Server 2003 (Adprep) também adiciona ases herdados; Portanto, o Trey Research precisava liberar espaço na unidade de disco antes de atualizar o domínio.

  • Condição 5: a Trey Research não realizava regularmente procedimentos de desfragmentação offline de arquivos Ntds.dit no modo Dsrepair.

  • Condição 6: quando o contêiner CN=FileLinks,CN=System,DC= nome de domínio no maior domínio foi revisado, ele revelou mais de 700.000 objetos de Rastreamento de Link Distribuído. O descritor de segurança em cada objeto De rastreamento de link distribuído era de aproximadamente 2 quilobytes (KBs). Cada uma dessas condições foi avaliada por sua contribuição para o arquivo .dit de 17 GB:

  • Condição 1: a Trey Research decidiu não implantar novas unidades por causa do custo e do tempo necessário para fazê-lo. Além disso, eles só precisavam do espaço em disco temporariamente porque esperavam que o Banco de Dados do Active Directory reduzisse depois que eles atualizaram para o Windows Server 2003 e o processo do SIS (Single Instance Store) foi concluído (o SIS implementa um armazenamento mais eficiente de permissões em bancos de dados do Active Directory).

  • Condições 2 e 3: a Trey Research decidiu que essas condições eram as melhores práticas; no entanto, mesmo que a Trey Research os implementasse, eles não alcançariam os resultados necessários. Eles decidiram habilitar a limpeza de DNS porque ela é facilmente implementada.

  • Condição 4: a Trey Research percebeu que, se redefinissem os descritores de segurança e as listas de controle de acesso do sistema (SACLs), alcançariam os resultados que estão procurando, mas decidiram que esse procedimento seria demorado para implementar até que pudessem testar completamente a redução de tamanho, a sobrecarga de replicação e, mais importante, a compatibilidade programa/administração no cenário de laboratório que espelha o ambiente de produção.

    Como a Trey Research implantou o Windows 2000 SP2 e alguns hotfixes, eles esperavam que os ases herdados incrementais que foram adicionados pelo Adprep (a objetos no domínio NC) pudessem ser tão pequenos quanto 300 megabytes (MBs). Eles poderiam verificar esse comportamento em um ambiente de laboratório que é usado para testar atualizações da floresta de produção.

  • Condição 5: a Trey Research percebeu que, se executassem um procedimento de desfragmentação offline, talvez não recuperassem o "whitespace" no arquivo Ntds.dit. Na verdade, os administradores da Trey Research notaram um aumento no tamanho do banco de dados imediatamente após concluirem o procedimento de desfragmentação offline. Esse comportamento ocorreu devido a uma ineficiência no mecanismo de banco de dados do Windows 2000; esse mecanismo é aprimorado no Windows Server 2003.

  • Condição 6: a Trey Research concordou que o curso óbvio de ação seria executar uma exclusão em massa simples de todos os objetos de Rastreamento de Link Distribuído do contêiner CN=FileLinks,CN=System,DC= nome de domínio em um controlador de domínio em cada domínio na floresta. No entanto, eles perceberam que, se o fizessem, o espaço adicional em disco não seria liberado até que os objetos tivessem sido tombados e o lixo coletado, e até que eles concluíssem um procedimento de desfragmentação offline em cada controlador de domínio nesse domínio. Embora o valor de tempo de vida da lápide possa ser definido como valores tão baixos quanto dois dias, vários controladores de domínio na floresta do Trey Research estavam offline enquanto aguardavam atualizações de hardware e software. Se os objetos forem tombados antes que a replicação de ponta a ponta possa ocorrer, objetos excluídos poderão ser reanimados ou dados inconsistentes poderão ser relatados entre servidores de catálogo globais na floresta. Para fornecer alívio imediato, a Trey Research realizou o seguinte procedimento:

  1. Eles removeram o descritor de segurança padrão para objetos de classe de esquema de Rastreamento de Link Distribuído e substituíram-no por uma única entidade de segurança (conta de usuário).
  2. Eles escreveram um programa VBScript que removeu todos os descritores de segurança existentes e os substituíram por um ás explícito para uma única entidade de segurança.
  3. Eles excluíram objetos de Acompanhamento de Link Distribuído em incrementos de 10.000 unidades com um atraso de três horas entre cada exclusão de objeto.
  4. Eles executaram um procedimento de desfragmentação offline em cada controlador de domínio no domínio depois que todos os objetos de Rastreamento de Link Distribuído foram excluídos. Quando o Trey Research removeu o descritor e realizou o procedimento de desfragmentação, o banco de dados recuperou cerca de 1,5 GB de espaço em disco em todos os controladores de domínio no domínio. Essa quantidade de espaço foi suficiente para executar confortavelmente a ferramenta do Adprep e atualizar todos os controladores de domínio e catálogos globais baseados no Windows 2000 para o Windows Server 2003.

Depois que o Trey Research atualizou o sistema operacional para o Windows Server 2003, mais espaço em disco foi liberado quando o recurso de armazenamento de instância única no Windows Server 2003 reduziu o tamanho do banco de dados para cerca de 8 GB (você deve executar um procedimento de desfragmentação offline para obter esses resultados). Mais espaço foi recuperado depois que o intervalo TSL expirou, objetos de rastreamento de link distribuído foram coletados e eles realizaram um procedimento de desfragmentação offline.

A Trey Research promoveu um novo réplica controlador de domínio baseado no Windows 2000 no domínio e colocou a conta do computador em uma unidade organizacional diferente do que normalmente eram usadas. Em dois dias, cerca de 8.000 objetos de Rastreamento de Link Distribuído estiveram presentes no controlador de domínio baseado no Windows 2000. O Trey Research interrompeu o Controle de Link Distribuído ou criou uma política para parar o serviço e vinculou a política a unidades organizacionais que hospedam controladores de domínio baseados no Windows 2000. Por fim, o Trey Research usou Dltpurge.vbs para marcar os objetos restantes de Rastreamento de Link Distribuído para exclusão.

Anatomia da exclusão de objeto DLT

Os próprios objetos DLT contêm poucos atributos e usam pouco espaço no Active Directory. Quando um objeto é marcado para exclusão (tombstoned), todos os atributos desnecessários são retirados, exceto aqueles necessários para rastrear o objeto até que ele seja limpo do Active Directory.

No caso dos objetos de rastreamento de link, marcar o objeto para exclusão equivale apenas a dois atributos que estão sendo removidos: dscorepropagationdata e objectcategory. A exclusão dos dois atributos resulta em uma economia inicial de 34 bytes. No entanto, o processo de marcação do objeto de rastreamento de link para exclusão também atualiza o objeto adicionando um atributo IS_DELETED (4 bytes) e mapeando os atributos RDN e "nome comum", fazendo com que cada um desses atributos cresça em cerca de 80 bytes. Além disso, o atributo "metadados de replicação" também cresce em cerca de 50 bytes para refletir as atualizações executadas neste objeto. Portanto, marcando um objeto de rastreamento de link para exclusão, o objeto acabará crescendo em aproximadamente 200 bytes. O NTDS. O DIT não exibirá uma redução de tamanho até que os objetos excluídos tenham tombado, sido coletados lixo e uma desfragmentação offline executada.

Observação

Se o serviço estiver desativado, como este artigo recomenda, a limpeza automática não ocorrerá.

Versão de texto do Dltpurge.vbs

Para usar este script:

  1. Copie todo o texto entre a <marca Iniciar Copiar Aqui> e a <marca End Copy Here> neste artigo e cole o texto em um arquivo de editor de texto ASCII (por exemplo, um arquivo Microsoft Notepad).
  2. Salve o arquivo como "Dltpurge.vbs". 3 Conclua o procedimento descrito em Como excluir objetos de rastreamento de link distribuído
<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>