Testing AD LDS (ADAM) replication with Powershell
Earlier this month I had a discussion with Laura (of AD Cookbook fame) regarding ADLDS and how to test convergence. After a few minutes I remembered I had a AD convergence script I wrote a while back found HERE. With a little tweaking (specifically discoverability) we converted it to test ADLDS as well. Below you will fine the result.
Parameters
- Server: The ADLDS/ADAM server that hosts the application partition you want to test
- DN: The distinguished name of the application partition you want to test (will try to discover)
- Port: Port ADLDS/ADAM list on (Default 389)
- Table [switch]: A switch that outputs an object with the results.
Note: Please feel free to provide any feedback you have regarding this. I do not use ADLDS or ADAM so other than my test environment I really cannot play with this.
The Code
Test-LDSReplication.ps1
$DN,
$Port = "389",
[switch]$table
)
function Ping-Server {
Param([string]$srv)
$pingresult = Get-WmiObject win32_pingstatus -f "address=’$srv’ and Timeout=1000"
if($pingresult.statuscode -eq 0) {$true} else {$false}
}
$DirectoryServer = "{0}:{1}" -f $Server,$Port
$Context = new-object System.DirectoryServices.ActiveDirectory.DirectoryContext("DirectoryServer",$DirectoryServer)
$ADAM = [System.DirectoryServices.ActiveDirectory.AdamInstance]::GetAdamInstance($context)
if(!$DN)
{
$AppPartition = $ADAM.ConfigurationSet | %{$_.ApplicationPartitions} | Select-Object -first 1
$DN = $AppPartition.Name
$dclist = $AppPartition.DirectoryServers | ?{$_.HostName -notmatch $Server}
}
else
{
$dclist = $ADAM.ConfigurationSet.AdamInstances | ?{($_.Partitions -contains $DN) -and ($_.HostName -notmatch $Server)}
}
if($table)
{
$DCTable = @()
$myobj = "" | select Name,Time
$myobj.Name = ("$Server [SOURCE]").ToUpper()
$myobj.Time = 0.00
$DCTable += $myobj
}
$timestamp = [datetime]::Now.ToFileTime().ToString()
Write-Host "`n Modifying wwwHomePage Attribute on Object [$DN] on [$DirectoryServer] with value [$timestamp]"
$object = ([ADSI]"LDAP://$DirectoryServer/$DN")
$object.wWWHomePage = $timeStamp
$object.SetInfo()
$objectDN = $object.distinguishedname
Write-Host " Object [$objectdn] Modified! `n"
$start = Get-Date
$i = 0
Write-Host " Found [$($dclist.count)] LDS replicas"
$cont = $true
While($cont)
{
$i++
$oldpos = $host.UI.RawUI.CursorPosition
Write-Host " =========== Check $i ===========" -fore white
start-Sleep 1
$replicated = $true
foreach($dc in $dclist)
{
if($server -match $dc.HostName){continue}
if(ping-server $dc.HostName)
{
$DCServer = "{0}:{1}" -f $dc.HostName,$dc.LdapPort
$object = [ADSI]"LDAP://$DCServer/$dn"
if($object.wwwHomePage -eq $timeStamp)
{
Write-Host " - $DCServer Has Object Description [$dn]" (" "*5) -fore Green
if($table -and !($dctable | ?{$_.Name -match $dc.HostName}))
{
$myobj = "" | Select-Object Name,Time
$myobj.Name = $dc.HostName.ToUpper()
$myobj.Time = ("{0:n2}" -f ((Get-Date)-$start).TotalSeconds)
$dctable += $myobj
}
}
else{Write-Host " ! $($dc.HostName.ToUpper()) Missing Object [$dn]" -fore Red;$replicated = $false}
}
else
{
Write-Host " ! $($dc.HostName.ToUpper()) Failed PING" -fore Red
if($table -and !($dctable | ?{$_.Name -match $dc}))
{
$myobj = "" | Select-Object Name,Time
$myobj.Name = $dc.HostName.ToUpper()
$myobj.Time = "N/A"
$dctable += $myobj
}
}
}
if($replicated){$cont = $false}else{$host.UI.RawUI.CursorPosition = $oldpos}
}
$end = Get-Date
$duration = "{0:n2}" -f ($end.Subtract($start).TotalSeconds)
Write-Host "`n Took $duration Seconds `n" -fore Yellow
if($table){$dctable | Sort-Object Time}
tshell :: Jan.26.2009 :: Active Directory, All, Powershell :: No Comments »

