Check Active Directory Latency With Powershell
For managing large scale Active directory environment more important part checking and understanding replication quality. In this condition i used repadmin command to check replication healthy. But this command not enough to understand exactly replication finished time. So i start to search internet and find script to check active directory latency with poweshell (http://bsonposh.com/archives/276) when i started this script i understood this script not handle large scale of dc environment. and it’s enter loop if replication will not finished.
After i changed this script ;
- user can edit how many time to try replication;
- separated replication success&failure situation
- Replication time
- Average of replication
How script works first script connect ldap and query how many domain controller have in your environment; then crate test contact under user ou start “savasTest” + (Get-Date -f MMddyyHHmmss)” and after try to connect all dc and check this contact object exist or not.
Param($target = (([ADSI]"LDAP://rootDSE").dnshostname), $fqdn = (([ADSI]"").distinguishedname -replace "DC=","" -replace ",","."), $ou = ("cn=users," + ([ADSI]"").distinguishedname), $remove = $true, [switch]$table ) $context = new-object System.DirectoryServices.ActiveDirectory.DirectoryContext("Domain",$fqdn) $dclist = [System.DirectoryServices.ActiveDirectory.DomainController]::findall($context) $name = "savasTest" + (Get-Date -f MMddyyHHmmss) Write-Host "`n Creating Temp Contact Object [$name] on [$target]" $contact = ([ADSI]"LDAP://$target/$ou").Create("contact","cn=$Name") $contact.SetInfo() $dn = $contact.distinguishedname Write-Host " Temp Contact Object [$dn] Created! `n" $start = Get-Date Write-Host " Found [$($dclist.count)] Domain Controllers" $dataTable = New-Object System.Data.DataTable $dataTable.Columns.Add("DcName") | Out-Null $dataTable.Columns.Add("Success", [int]) | Out-Null $dataTable.Columns.Add("RepTime") | Out-Null foreach($dc in $dclist) { $row = $dataTable.NewRow() $row["DcName"] = $dc.Name $row["Success"] = 0 $row["RepTime"] = "yok" $dataTable.Rows.Add($row) } $baksinMi = $true Write-Host "how many turn you want to try" -ForegroundColor Cyan $trycount = Read-Host for($i = 0;$i -lt $trycount; $i++) { $oldpos = $host.UI.RawUI.CursorPosition Write-Host " =========== Check $i ===========" -fore white start-Sleep 1 foreach($dc in $dclist) { $baksinMi = $true for($d = 0;$d -lt $dataTable.Rows.Count; $d++) { if($dataTable.Rows[$d][0] -eq $dc.Name) { if($dataTable.Rows[$d][1] -eq 1) { $baksinMi = $false } else { $baksinMi = $true } break; } } if($baksinMi = $true) { if($target -match $dc.Name){continue} $object = [ADSI]"LDAP://$($dc.Name)/$dn" if($object.name) { Write-Host " - $($dc.Name.ToUpper()) Has Object [$dn]" (" "*5) -fore Green $dataTable | where {$_.DcName -eq $dc.Name} | foreach {$_.Success = 1; $_.RepTime = ("{0:n2}" -f ((Get-Date)-$start).TotalSeconds).ToString()} } else { Write-Host " ! $($dc.Name.ToUpper()) Missing Object [$dn]" -fore Red; } } } } $end = Get-Date $duration = "{0:n2}" -f ($end.Subtract($start).TotalSeconds) Write-Host "`n Took $duration Seconds `n" -fore Yellow if($remove) { Write-Host " Removing Test Object `n" -fore Red ([ADSI]"LDAP://$target/$ou").Delete("contact","cn=$Name") } if($dataTable) { $dataTable | Format-Table -AutoSize } $abc=$dataTable | where {$_.Success -eq 1}|measure|Select-Object count Write-Host " Total $($dclist.count) Domain Controller's replicate only $($abc.count) " -ForegroundColor Cyan $ortalama = ($abc.count*100)/$dclist.count Write-Host " Averege % $ortalama server replicated." -ForegroundColor Yellow