## 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 += ""
}
$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"