Udostępnij za pośrednictwem


Śledzenie Rozproszonych Łączy na kontrolerach domenowych opartych na Windows

Ten artykuł opisuje, jak można korzystać z usług śledzenia rozproszonych łączy w systemie Windows do śledzenia tworzenia i przenoszenia połączonych plików na woluminach i serwerach sformatowanych jako NTFS.

Oryginalny numer KB: 312403

Możesz używać usługi serwera śledzenia linków rozproszonych oraz usługi klienta śledzenia linków rozproszonych do śledzenia linków do plików na partycjach sformatowanych w systemie NTFS. Śledzenie łączy rozproszonych śledzi łącza w scenariuszach, gdy łącze jest utworzone do pliku na woluminie NTFS, takich jak skróty powłoki i łącza OLE. Jeśli ten plik zostanie przemianowany, przeniesiony na inny wolumin na tym samym komputerze, przeniesiony na inny komputer lub przeniesiony w innych podobnych sytuacjach, Windows używa Distributed Link Tracking, aby odnaleźć plik. Gdy uzyskujesz dostęp do linku, który został przeniesiony, System Śledzenia Linków Rozproszonych lokalizuje link; nie jesteś świadomy, że plik został przeniesiony ani że System Śledzenia Linków Rozproszonych jest używany do znalezienia przeniesionego pliku.

Śledzenie Rozproszonego Łącza składa się z usługi klienckiej i usługi serwerowej. Usługa Distributed Link Tracking Server działa wyłącznie na kontrolerach domeny opartych na systemie Windows Server. Przechowuje informacje w Active Directory i zapewnia usługi wspomagające działanie usługi klienta śledzenia linków rozproszonych. Usługa Klienta Śledzenia Połączeń Rozproszonych działa na wszystkich komputerach z systemami Windows 2000 oraz Microsoft Windows XP, w tym na tych w środowiskach grup roboczych oraz tych, które nie znajdują się w grupie roboczej. Zapewnia jedyną interakcję z serwerami śledzenia rozproszonych linków.

Klienci śledzenia łączy rozproszonych czasami dostarczają usługę serwera śledzenia łączy rozproszonych z informacjami o łączach plików, które ta usługa przechowuje w Active Directory. Klienci Distributed Link Tracking mogą również zapytać usługę Distributed Link Tracking Server o te informacje, gdy nie można rozwiązać skrótu powłoki lub połączenia OLE. Klienci Distributed Link Tracking skłaniają serwer Distributed Link Tracking do aktualizacji linków co 30 dni. Usługa Distributed Link Tracking Server oczyszcza obiekty, które nie były aktualizowane przez 90 dni.

Kiedy plik, do którego odnosi się link, zostaje przeniesiony na inny wolumin (na tym samym komputerze lub na innym komputerze), klient systemu Śledzenia Linków Rozproszonych powiadamia serwer Śledzenia Linków Rozproszonych, który tworzy obiekt linkTrackOMTEntry w usłudze Active Directory. Obiekt linkTrackVolEntry jest tworzony w Active Directory dla każdego woluminu NTFS w domenie.

Uwaga / Notatka

W Windows Server 2008 i nowszych, usługa Distributed Link Tracking Server nie jest już dołączona do systemu Windows. Możesz bezpiecznie usunąć obiekty z Active Directory.

Obiekty śledzenia łączy rozproszonych są replikowane na wszystkich kontrolerach domeny w domenie, która hostuje konto komputerowe oraz na wszystkich serwerach katalogu globalnego w lesie. Usługa Distributed Link Tracking Server tworzy obiekty w następującej ścieżce wyróżnionej nazwy:

CN=FileLinks,CN=System,DC= kontener usługi Active Directory dla nazwy domeny

Obiekty śledzenia łączy rozproszonych występują w dwóch następujących tabelach w folderze CN=FileLinks,CN=System:

  • CN=ObjectMoveTable,CN=FileLinks,CN=System,DC= nazwa domeny:

Ten obiekt przechowuje informacje o powiązanych plikach, które zostały przeniesione w domenie.

  • CN=VolumeTable,CN=FileLinks,CN=System,DC= nazwa domeny:

    Ten obiekt przechowuje informacje o każdym woluminie NTFS w domenie.

Obiekty Distributed Link Tracking zajmują niewiele miejsca indywidualnie, jednak mogą zajmować dużo przestrzeni w katalogu Active Directory, gdy są dozwolone do gromadzenia się przez dłuższy czas.

Jeśli wyłączysz śledzenie linków rozproszonych i usuniesz obiekty śledzenia linków rozproszonych z usługi Active Directory, może wystąpić następujące zachowanie:

  • Rozmiar bazy danych Active Directory może zostać zmniejszony (to zachowanie występuje po tym, jak obiekty zostały oznaczone jako przestarzałe i usunięte w wyniku zbierania śmieci, a także po wykonaniu procedury defragmentacji offline).
  • Ruch replikacji między kontrolerami domen może zostać zmniejszony.

W systemach Windows 2000, Windows XP i Windows Server 2003 wartość uruchomienia usługi Klienta Śledzenia Łącz jest ustawiona na Automatyczny. Na serwerach opartych na Windows 2000, usługa Distributed Link Tracking Server domyślnie uruchamia się ręcznie. Jednakże, jeśli użyjesz Dcpromo.exe, aby promować serwer do domeny, usługa Distributed Link Tracking Server zostanie skonfigurowana do automatycznego uruchamiania.

Dla serwerów opartych na Windows Server 2003, usługa Distributed Link Tracking Server jest domyślnie wyłączona. Gdy używasz Dcpromo.exe do promocji serwera do domeny, usługa śledzenia łączy dystrybucyjnych nie jest skonfigurowana do automatycznego uruchamiania. Gdy kontroler domeny oparty na systemie Windows 2000 jest uaktualniany do systemu Windows Server 2003, usługa Distributed Link Tracking Server jest również wyłączana podczas tego uaktualnienia. Jeśli jesteś administratorem i chcesz korzystać z usługi Distributed Link Tracking Server, musisz albo użyć zasad grupy, albo ręcznie ustawić, aby usługa uruchamiała się automatycznie. Dodatkowo, usługa Klienta Śledzenia Rozproszonych Linków na komputerach z systemem Windows Server 2003 lub Windows XP SP1 domyślnie nie próbuje korzystać z usługi Serwera Śledzenia Rozproszonych Linków. Jeśli chcesz skonfigurować te komputery, aby skorzystały z usługi Distributed Link Tracking Server, włącz ustawienie zasady umożliwiające klientom Distributed Link Tracking korzystanie z zasobów domeny. Aby to zrobić, otwórz w Edytorze zasad grupy węzeł Konfiguracja komputera/Szablony administracyjne/System.

Microsoft zaleca użycie następujących ustawień w połączeniu z funkcją śledzenia rozproszonych łączy na serwerach opartych na systemie Windows 2000.

  1. Wyłącz usługę Distributed Link Tracking Server na wszystkich kontrolerach domeny (jest to domyślna konfiguracja we wszystkich serwerach opartych na Windows Server 2003).

    Ze względu na narzut replikacji i przestrzeń, jaką wykorzystują tabele FileLinks w Active Directory, Microsoft zaleca wyłączenie usługi Distributed Link Tracking Server na kontrolerach domen Active Directory. Aby zatrzymać usługę, skorzystaj z jednej z poniższych metod:

    • W przystawce Usługi (Services.msc lub compmgmt.msc) dwukrotnie kliknij usługę Distributed Link Tracking Server, a następnie w polu Typ uruchamiania wybierz Wyłączone.

    • Określ wartość uruchamiania w węźle Zasady grupy/Konfiguracja komputera/Ustawienia Windows/Usługi systemowe.

    • Zdefiniuj ustawienia zasad w jednostce organizacyjnej, która obejmuje wszystkie kontrolery domeny Windows 2000.

    Uruchom ponownie kontrolery domeny po replikacji zasad, aby zasady zostały zastosowane. Jeśli nie zrestartujesz kontrolerów domeny, będziesz musiał ręcznie zatrzymać usługę na każdym kontrolerze domeny.

  2. Usuń obiekty śledzenia rozproszonych łączy z kontrolerów domeny Active Directory.

    Zobacz sekcję "Jak usunąć obiekt śledzenia łączy rozproszonych" w tym artykule, aby uzyskać więcej informacji o usuwaniu obiektów śledzenia łączy rozproszonych. Zaleca się usunięcie obiektów po wyłączeniu usługi Serwera Śledzenia Rozproszonych Odnośników.

    Uwaga / Notatka

    Rozmiar drzewa informacji katalogowej (DIT) na kontrolerach domeny nie zostanie zmniejszony, dopóki nie zostaną wykonane następujące czynności.

    1. Obiekty są usuwane z usługi katalogowej.

      Uwaga / Notatka

      Usunięte obiekty są przechowywane w kontenerze Usuniętych Obiektów, dopóki nie wygaśnie okres przechowywania. Domyślna wartość dla czasu życia nagrobka wynosi 60 dni. Minimalna wartość to dwa dni. Domyślnie wartość wynosi 180 dni dla nowych lasów, które są instalowane razem z Windows Server 2003 Service Pack 1 lub późniejszą wersją Windows Server 2003.

      Jeśli nie dysponujesz solidnym monitorowaniem replikacji Active Directory, zalecamy użycie wartości 180 dni. Nie zmniejszaj tej wartości, aby rozwiązać problemy z rozmiarem DIT. Jeśli masz problemy z rozmiarem bazy danych, skontaktuj się z działem wsparcia technicznego Microsoft.

    2. Zbieranie śmieci zostało ukończone.

    3. Używasz Ntdsutil.exe do defragmentacji pliku Ntds.dit w trybie Dsrepair.

Nie jest konieczne ręczne usuwanie obiektów Śledzenia Linków Rozproszonych po zatrzymaniu usługi serwera Śledzenia Linków Rozproszonych, chyba że musisz jak najszybciej odzyskać przestrzeń dyskową zajmowaną przez te obiekty. Klienci Distributed Link Tracking skłaniają serwer Distributed Link Tracking do aktualizacji linków co 30 dni. Usługa serwera śledzenia linków rozproszonych usuwa obiekty, które nie były aktualizowane przez 90 dni.

Po uruchomieniu skryptu VBScript Dltpurge.vbs wszystkie obiekty Active Directory używane przez usługę Distributed Link Tracking Server zostaną usunięte z domeny, w której uruchamiany jest skrypt. Należy uruchomić skrypt na jednym kontrolerze domeny dla każdej domeny w lesie. Aby uruchomić Dltpurge.vbs:

  1. Aby uzyskać skrypt Dltpurge.vbs, skontaktuj się z pomocą techniczną firmy Microsoft.

  2. Zatrzymaj usługę Distributed Link Tracking Server na wszystkich kontrolerach domeny w domenie, która jest celem Dltpurge.vbs.

  3. Użyj uprawnień administratora, aby zalogować się do konsoli kontrolera domeny lub komputera członkowskiego w domenie, która jest celem Dltpurge.vbs.

  4. Aby uruchomić Dltpurge.vbs z wiersza poleceń, użyj następującej składni:

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

    W tej linii poleceń:

    • -s jest nazwą hosta DNS kontrolera domeny, na którym chcesz usunąć obiekty Śledzenia Odnośników Rozproszonych.
    • -d to wyróżniająca ścieżka nazwy domeny, w której chcesz usunąć obiekty Rozproszonych Odnośników Śledzenia.
  5. Wykonaj procedurę defragmentacji offline pliku Ntds.dit po usunięciu obiektów metodą tombstoning i oczyszczaniu z niepotrzebnych danych. Aby uzyskać więcej informacji na temat procesu zarządzania pamięcią, kliknij następujący numer artykułu, aby wyświetlić artykuł w Bazie Wiedzy Microsoft:

    198793 proces zbierania śmieci w bazie danych Active Directory

Przykładowe doświadczenie klienta

Najgorszy scenariusz opisany w tej sekcji ilustruje pewne kwestie do rozważenia, gdy usuwasz dużą liczbę obiektów Śledzenia Linków Rozproszonych w dużej domenie produkcyjnej.

Trey Research, fikcyjny klient z listy Fortune 500 z ponad 40,000 pracowników na całym świecie, wdraża pojedynczą strukturę Active Directory, która składa się z pustej domeny głównej z domenami podrzędnymi odpowiadającymi głównym regionom geograficznym świata (Ameryka Północna, Azja, Europa, i tak dalej). Największa domena w lesie zawiera około 35 000 kont użytkowników i tę samą liczbę kont komputerów.

Pliki Ntds.dit zostały umieszczone na macierzach RAID o pojemności 18 gigabajtów (GB). Od początkowego wdrożenia systemu Windows 2000 pliki globalnego katalogu urosły do 17 GB.

Firma Trey Research chce wdrożyć Windows Server 2003 w ciągu następnych 10 dni, ale potrzebuje co najmniej 1,5 GB wolnego miejsca na dysku na partycji bazy danych przed rozpoczęciem aktualizacji. Mają oni potrzebne tyle miejsca na dysku, ponieważ wiadomo, że Adprep.exe dodaje od trzech do pięciu dziedziczonych wpisów ACL, w zależności od zainstalowanych wcześniej poprawek i pakietów serwisowych. Następujące warunki przyczyniają się do dużego rozmiaru globalnego katalogu lub braku miejsca na dysku:

  • Warunek 1: Trey Research był wczesnym użytkownikiem systemu Windows 2000, a największe dyski, które otrzymali od preferowanego dostawcy sprzętu, miały pojemność 9 GB lub 18 GB, gdy były skonfigurowane w macierzy RAID. Obecne dyski mają dwukrotnie większy rozmiar przy połowie kosztów.

  • Warunek 2: Oczyszczanie DNS nie było włączone dla stref DNS zintegrowanych z Active Directory, które były przypisane do każdej domeny w lesie.

  • Warunek 3: Użytkownicy domen mogli tworzyć konta komputerów w domenie. Administratorzy nie mieli powtarzalnego procesu identyfikacji i usuwania porzuconych kont komputerów.

  • Warunek 4: Z biegiem czasu deskryptory zabezpieczeń były definiowane przez administratorów, pakiety serwisowe i poprawki na głównych kontekstach nazewniczych (NC) (cn=schema, cn=configuration, cn=domena) oraz innych kontenerach, które przechowują tysiące obiektów w Active Directory. Ponadto, na tych samych partycjach włączono audyt. Kiedy ustawiasz uprawnienia i włączasz audytowanie obiektów w Active Directory, rozmiar bazy danych rośnie. Narzędzie, które przygotowuje lasy i domeny Windows 2000 do kontrolerów domen opartych na Windows Server 2003 (Adprep), również dodaje odziedziczone listy kontroli dostępu, dlatego Trey Research musiało zwolnić miejsce na dysku przed aktualizacją domeny.

  • Warunek 5: Trey Research nie przeprowadzał regularnych procedur offline defragmentacji plików Ntds.dit w trybie Dsrepair.

  • Warunek 6: Po przejrzeniu kontenera CN=FileLinks,CN=System,DC=domain name w największej domenie ujawniono ponad 700,000 obiektów Śledzenia Rozproszonych Linków. Deskryptor zabezpieczeń dla każdego obiektu Śledzenia Rozproszonych Linków miał rozmiar około 2 kilobajtów (KB). Każdy z tych warunków został oceniony pod kątem jego wkładu w plik .dit o rozmiarze 17 GB.

  • Warunek 1: Trey Research zdecydował się nie wdrażać nowych dysków z powodu kosztów i czasu, jaki by to zajęło. Ponadto potrzebowali miejsca na dysku tylko tymczasowo, ponieważ spodziewali się, że baza danych Active Directory zmniejszy rozmiar po zaktualizowaniu do Windows Server 2003 i zakończeniu procesu Single Instance Store (SIS implementuje bardziej efektywne przechowywanie uprawnień w bazach danych Active Directory).

  • Warunki 2 i 3: Trey Research uznało, że te warunki są najlepszymi praktykami; jednakże, nawet jeśli Trey Research wprowadziłoby je w życie, nie osiągnęliby potrzebnych rezultatów. Zdecydowali się umożliwić odśmiecanie DNS, ponieważ jest to łatwe do wdrożenia.

  • Warunek 4: Trey Research zdał sobie sprawę, że jeśli zdefiniują na nowo deskryptory bezpieczeństwa i listy kontroli dostępu do systemu (SACLs), osiągną wyniki, które chcą uzyskać, ale zdecydowali, że wdrożenie tej procedury będzie czasochłonne do momentu, gdy nie będą mogli dokładnie przetestować redukcji rozmiaru, narzutu replikacyjnego i, co najważniejsze, kompatybilności z programem/administracją w scenariuszu laboratoryjnym odzwierciedlającym środowisko produkcyjne.

    Ponieważ Trey Research wdrożyli system Windows 2000 SP2 i kilka poprawek, oczekiwali, że dodatkowe dziedziczone ACE, które zostały dodane przez Adprep (do obiektów w domenie NC), mogą być tak małe, jak 300 megabajtów (MB). Można zweryfikować to zachowanie w środowisku laboratoryjnym, które jest używane do testowania aktualizacji lasu produkcyjnego.

  • Warunek 5: Trey Research zdał sobie sprawę, że jeśli przeprowadzą procedurę defragmentacji offline, mogą nie odzyskać „białych znaków” w pliku Ntds.dit. Faktycznie, administratorzy z firmy Trey Research zauważyli wzrost rozmiaru bazy danych natychmiast po ukończeniu procedury offline'owej defragmentacji. To zachowanie wystąpiło z powodu nieefektywności w silniku bazy danych Windows 2000; ten silnik został ulepszony w Windows Server 2003.

  • Warunek 6: Trey Research zgodził się, że oczywistym działaniem byłoby wykonanie prostego masowego usunięcia wszystkich obiektów Śledzenia Połączeń Rozproszonych (Distributed Link Tracking) z kontenera CN=FileLinks,CN=System,DC=nazwa domeny na kontrolerze domeny w każdej domenie w lesie. Zauważyli jednak, że jeśli to zrobią, dodatkowa przestrzeń dyskowa nie zostanie zwolniona, dopóki obiekty nie zostaną oznaczone jako usunięte i zebrane przez mechanizm garbage collection oraz dopóki nie ukończą procedury offline defragmentacji na każdym kontrolerze domeny w tej domenie. Chociaż wartość okresu życia nagrobka można ustawić na tak niską, jak dwa dni, kilka kontrolerów domeny w lesie Trey Research było offline, oczekując na aktualizacje sprzętu i oprogramowania. Jeśli obiekty zostaną oznaczone do usunięcia przed zakończeniem replikacji end-to-end, usunięte obiekty mogą zostać ożywione lub mogą wystąpić niespójne dane między serwerami globalnego katalogu w lesie. Aby zapewnić natychmiastową ulgę, Trey Research przeprowadził następującą procedurę:

  1. Usunięto domyślny deskryptor zabezpieczeń dla obiektów klasy schematów Distributed Link Tracking i zastąpiono go pojedynczym zasadniczym podmiotem zabezpieczeń (konta użytkownika).
  2. Napisali program w VBScript, który usunął wszystkie istniejące deskryptory zabezpieczeń, a następnie zastąpił je wyraźnym wpisem ACL (Access Control Entry) dla pojedynczego obiektu zabezpieczeń.
  3. Usunęli obiekty śledzenia linków rozproszonych w przyrostach o 10 000 jednostek z trzygodzinnym opóźnieniem między usunięciami każdego obiektu.
  4. Przeprowadzili procedurę defragmentacji offline na każdym kontrolerze domeny w tej domenie, po usunięciu wszystkich obiektów śledzenia łączy rozproszonych. Gdy Trey Research usunęło deskryptor i przeprowadziło procedurę defragmentacji, baza danych odzyskała około 1,5 GB miejsca na dysku na wszystkich kontrolerach domeny w domenie. Taka ilość miejsca była wystarczająca, aby wygodnie uruchomić narzędzie Adprep i zaktualizować wszystkie kontrolery domen oraz katalogi globalne oparte na Windows 2000 do systemu Windows Server 2003.

Po tym, jak Trey Research zaktualizował system operacyjny do Windows Server 2003, zwolniono więcej miejsca na dysku, gdy funkcja magazynu jednostkowego w systemie Windows Server 2003 zredukowała rozmiar bazy danych do około 8 GB (aby uzyskać te wyniki, musisz przeprowadzić procedurę defragmentacji offline). Więcej miejsca zostało odzyskane po wygaśnięciu interwału TSL, obiekty Śledzenia Łącz Dystrybucyjnych zostały usunięte jako niepotrzebne, a także przeprowadzono procedurę defragmentacji offline.

Trey Research awansowało nowy replikowany kontroler domeny oparty na systemie Windows 2000 do domeny i umieściło konto komputera w innej jednostce organizacyjnej niż zwykle używali. W ciągu dwóch dni na kontrolerze domeny opartym na systemie Windows 2000 było obecnych około 8000 obiektów Śledzenia Rozproszonych Linków. Trey Research albo zatrzymał Śledzenie Linków Rozproszonych, albo utworzył politykę, aby zatrzymać usługę, a następnie powiązał politykę z jednostkami organizacyjnymi, które obsługują kontrolery domen oparte na systemie Windows 2000. Wreszcie, firma Trey Research użyła Dltpurge.vbs, aby oznaczyć pozostałe obiekty Śledzenia Rozproszonych Łączy do usunięcia.

Anatomia usuwania obiektu DLT

Obiekty DLT same w sobie zawierają niewiele atrybutów i zajmują mało miejsca w Active Directory. Gdy obiekt zostaje oznaczony do usunięcia (tombstoned), wszystkie niepotrzebne atrybuty są usuwane, z wyjątkiem tych niezbędnych do śledzenia obiektu do momentu jego usunięcia z Active Directory.

W przypadku obiektów śledzenia linków, oznaczenie obiektu do usunięcia skutkuje jedynie usunięciem dwóch atrybutów: dscorepropagationdata i objectcategory. Usunięcie dwóch atrybutów skutkuje początkową oszczędnością 34 bajtów. Jednakże proces oznaczania obiektu śledzenia linków do usunięcia również aktualizuje ten obiekt przez dodanie atrybutu IS_DELETED (4 bajty) oraz przez modyfikację atrybutów RDN i „nazwy wspólnej”, co powoduje, że każdy z tych atrybutów powiększa się o około 80 bajtów. Dodatkowo, atrybut "metadane replikacji" również zwiększa się o około 50 bajtów, aby odzwierciedlić aktualizacje wprowadzone na tym obiekcie. Wskazując obiekt śledzenia linków do usunięcia, obiekt wzrośnie o około 200 bajtów. NTDS.DIT nie będzie wykazywać zmniejszenia rozmiaru, dopóki usunięte obiekty nie zostaną oznaczone jako nagrobek, nie zostanie przeprowadzona zbiórka śmieci i nie zostanie wykonana defragmentacja offline.

Uwaga / Notatka

Jeśli usługa zostanie wyłączona, zgodnie z zaleceniami tego artykułu, automatyczne czyszczenie nie będzie miało miejsca.

Wersja tekstowa Dltpurge.vbs

Aby użyć tego skryptu:

  1. Skopiuj cały tekst między znacznikami <Start Copy Here> i <End Copy Here> w tym artykule, a następnie wklej tekst do pliku edytora tekstowego ASCII (na przykład do pliku programu Microsoft Notatnik).
  2. Zapisz plik jako "Dltpurge.vbs". 3 Wykonaj procedurę opisaną w Jak usunąć obiekty śledzenia łączy rozproszonych
<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>