Article ID: 315229 - Last Review: December 3, 2007 - Revision: 6.4 Text version of Dltpurge.vbs for Microsoft Knowledge Base article Q312403This article was previously published under Q315229 You can use the Distributed Link Tracking service in
Windows to track the creation and movement of linked files across
NTFS-formatted volumes and servers. This article contains a text version of the
Dltpurge.vbs script that is described in the following Microsoft Knowledge Base
article: 312403
(http://support.microsoft.com/kb/312403/
)
Distributed link tracking on Windows 2000-based domain controllers
To use this script:
- Copy all of the text between the <Start Copy Here>
tag and the <End Copy Here> tag in this article, and then paste the text
to a ASCII text editor file (for example, a Microsoft Notepad file).
- Save the file as "Dltpurge.vbs".
- Complete the procedure that is described in the following
Microsoft Knowledge Base article:
312403
(http://support.microsoft.com/kb/312403/
)
Distributed link tracking on Windows 2000-based domain controllers
<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>
APPLIES TO- Microsoft Windows 2000 Server
- Microsoft Windows 2000 Advanced Server
- Microsoft Windows 2000 Professional Edition
- Microsoft Windows 2000 Datacenter Server
- Microsoft Windows Server 2003, Standard Edition (32-bit x86)
- Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
- Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
- Microsoft Windows Server 2003, Enterprise x64 Edition
- Microsoft Windows Server 2003, 64-Bit Datacenter Edition
- Microsoft Windows XP Professional
- Microsoft Windows Small Business Server 2003 Premium Edition
- Microsoft Windows Small Business Server 2003 Standard Edition
| |