This script generate all the repadmin commands to find lingering object on all domain controllers in an Active Directory forest.
You will find below two versions of the script : one using the Microsoft Powershell cmdlet get-adobject (import-module activedirectory), another using the get-qadobject Powershell cmdlet from Quest.
Scripts :
$OutputFileLocation = "c:\temp\repadmin_cmds.txt"
$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"
Start-Transcript -path $OutputFileLocation -append
$myForest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
$dclist = $myforest.Sites | % { $_.Servers } |% { $_.Name }
$dcs_guid = get-adobject -searchbase 'CN=Sites,CN=Configuration,DC=rootdomain,DC=net' -properties ObjectGUID,distinguishedname -ldapfilter "ObjectClass=nTDSDSA" | % { @{GUID=$_.ObjectGUID;DN=$_.distinguishedname} }
foreach ($dcforestname in $dclist){
foreach ($dc_src_guid in $dcs_guid){
$hostname = ((($dc_src_guid.DN).split(',')[1]).split('=')[1]).tostring()
$dcfqdn = $dclist -like "$hostname*" | Out-String -Stream
$dclist_arr = ($dcfqdn).split(".")
$dcname = $dclist_arr[0]
$dcdomain = $dclist_arr[1 .. ($dclist_arr.count-1)]
$domain_dn = ""
for ($x = 0; $x -lt $dcdomain.Length ; $x++){
if ($x -eq ($dcdomain.Length - 1)){$Separator = ""}else{$Separator =","}
[string]$domain_dn += "DC=" + $dcdomain[$x] + $Separator
}
$srcdcguid = $dc_src_guid.GUID
"repadmin /removelingeringobjects $dcforestname $srcdcguid $domain_dn /advisory_mode >> lingering_debug.log" | out-host
}
}
Stop-Transcript
$myForest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
$dclist = $myforest.Sites | % { $_.Servers } |% { $_.Name }
$dcs_guid = get-qadobject -searchroot 'CN=Sites,CN=Configuration,DC=domain,DC=root' -Type nTDSDSA -IncludedProperties guid,dn -DontUseDefaultIncludedProperties | % {@{GUID=$_.guid;DN=$_.dn}}
foreach ($dcforestname in $dclist){
foreach ($dc_src_guid in $dcs_guid){
$hostname = ((($dc_src_guid.DN).split(',')[1]).split('=')[1]).tostring()
$dcfqdn = $dclist -like "$hostname*" | Out-String -Stream
$dclist_arr = ($dcfqdn).split(".")
$dcname = $dclist_arr[0]
$dcdomain = $dclist_arr[1 .. ($dclist_arr.count-1)]
$domain_dn = ""
for ($x = 0; $x -lt $dcdomain.Length ; $x++){
if ($x -eq ($dcdomain.Length - 1)){$Separator = ""}else{$Separator =","}
[string]$domain_dn += "DC=" + $dcdomain[$x] + $Separator
}
write-Host "repadmin /removelingeringobjects $dcforestname" $dc_src_guid.GUID $domain_dn "/advisory_mode >> lingering_debug.log"
}
}
Another tool can be used to find and remove lingering objects : repldiag
Syntax:
prompt > repldiag /?
Replication topology analyzer. From http://www.codeplex.com/ActiveDirectoryUtils.
Version: 2.0.4947.18978
Command Line Options: ReplDiag [/Save] [/CheckForStableReplTopology] [/RemoveLingeringObjects] [/ImportData:<FileName.X
ML>] [/ShowTestCases] [/OverrideDefaultReferenceDC:"dc=namingcontext,dc=com":domainController.namingcontext.com]
/UseRobustDCLocation -Query each and every DC for a list of DCs in
forest. Ensures replication instability does not cause any to be
missed.
/Save -Save out the data from the current environment to XML. File is named
"ReplicationData.xml" and is located in the current directory.
/ImportData -Import the XML that was saved during a prior execution of this
utility. Run one of the other options to do something with the data.
/ShowTestCases -Show detail about test cases.
Lingering Object Cleanup:
/RemoveLingeringObjects -Use the current forest topology to clean all the
NCs in the forest.
WILL NOT CLEAN WINDOWS 2000 SYSTEMS!!!
/AdvisoryMode -Check for lingering objects only, do not clean.
Must be used with /RemoveLingeringObjects.
/OverrideDefaultReferenceDC -Specify reference DC for a naming context when
when removing lingering objects, can be used multiple times for
different NCs.
Only functional if using /RemoveLingeringObjects.
/OutputRepadminCommandLineSyntax -Output the command line syntax for repadmin.
Only active in conjunction with /RemoveLingeringObjects.
Example syntax:
ReplDiag /Save
- Collect the AD replication topology from the environment and save it.
ReplDiag /ImportData:"ReplicationData.xml"
- Load in previously collected data and check replication status.
ReplDiag /RemoveLingeringObjects /OverrideDefaultReferenceDC:"cn=Configuration,dc=forestroot,dc=com":dc1.forestroot.com
/OverrideDefaultReferenceDC:"dc=forestroot,dc=com":dc2.forestroot.com
- Clean lingering objects in the forest. Since cleans happen on a per
NC basis, reference DCs must be overridden on a per NC basis. Each
override must be specified separately on the command line.
Must use the DNS FQDN for the DC.
References
My Powershell script categories
- Active Directory
- Cluster
- Database
- Exchange
- Files and folders
- Hardware
- Network
- Operating System
- PKI
- SCCM
- Service and process
- Tips
- VMWare
Find and remove lingering object in a forest
