## PowerShell ## Active Directory Replication Health Check Script ## Script uses repadmin to generate HTML report and sends it to e-mail #Variables $report_path = "C:\ps" $date = Get-Date -Format "yyyy-MM-dd" $array = @() #Powershell Function to delete files older than a certain age $intFileAge = 8 #age of files in days $strFilePath = $report_path #path to clean up #create filter to exclude folders and files newer than specified age Filter Select-FileAge { param($days) If ($_.PSisContainer) {} # Exclude folders from result set ElseIf ($_.LastWriteTime -lt (Get-Date).AddDays($days * -1)) {$_} } #get-Childitem -recurse $strFilePath | Select-FileAge $intFileAge 'CreationTime' |Remove-Item Function send_mail([string]$message,[string]$subject) { $emailFrom = "sender@mail.com" $emailTo = "to@mail.com" $emailCC = "cc@mail.com" $smtpServer = "smtp.mail.com" Send-MailMessage -SmtpServer $smtpServer -To $emailTo -Cc $emailCC -From $emailFrom -Subject $subject -Body $message -BodyAsHtml } ###Test all forest #$myForest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest() #$dclist = $myforest.Sites | % { $_.Servers } ### ###Test specific AD domain $Domain = "test.com" $dclist = (Get-ADDomain $Domain -Server $Domain).ReplicaDirectoryServers ### $html_head = "" foreach ($dcname in $dclist){ ###Test all forest #$source_dc_fqdn = ($dcname.name).tolower() ### ###Test specific domain $source_dc_fqdn = ($dcname).tolower() ### $ad_partition_list = repadmin /showrepl $source_dc_fqdn | select-string "dc=" foreach ($ad_partition in $ad_partition_list) { [Array]$NewArray=$NULL $result = repadmin /showrepl $source_dc_fqdn $ad_partition $result = $result | where { ([string]::IsNullOrEmpty(($result[$_]))) } $index_array_dst = 0..($result.Count - 1) | Where { $result[$_] -like "*via RPC" } foreach ($index in $index_array_dst){ $dst_dc = ($result[$index]).trim() $next_index = [array]::IndexOf($index_array_dst,$index) + 1 $next_index_msg = $index_array_dst[$next_index] $msg = "" if ($index -lt $index_array_dst[-1]){ $last_index = $index_array_dst[$next_index] } else { $last_index = $result.Count } for ($i=$index+1;$i -lt $last_index; $i++){ if (($msg -eq "") -and ($result[$i])) { $msg += ($result[$i]).trim() } else { $msg += " / " + ($result[$i]).trim() } } $Properties = @{source_dc=$source_dc_fqdn;NC=$ad_partition;destination_dc=$dst_dc;repl_status=$msg} $Newobject = New-Object PSObject -Property $Properties $array +=$newobject } } } $status_repl_ko = "

Active Directory Replication Problem :
" $status_repl_ok = "

Active Directory Replication OK :
" $subject = "Active Directory Replication status : "+$date $message = "

The full Active Directory Replication report is available here
" $message += $status_repl_ko if ($array | where {$_.repl_status -notlike "*successful*"}){ $message += $array | where {$_.repl_status -notlike "*successful*"} | select source_dc,nc,destination_dc,repl_status |ConvertTo-Html -Head $html_head -Property source_dc,nc,destination_dc,repl_status send_mail $message $subject } else { $message += "No problem detected
" } $message += $status_repl_ok $message += $array | where {$_.repl_status -like "*successful*"} | select source_dc,nc,destination_dc,repl_status |ConvertTo-Html -Head $html_head -Property source_dc,nc,destination_dc,repl_status $message | Out-File "$report_path\ad_repl_status_$date.html"