Hi all,
What are others using for a reliable, immediate notification that an Exchange
(2010) database has failed over to another server?
I found the below script, which looks perfect. I am thinking of setting it as
a scheduled task for every 30 min...
But I just wanted to check if anyone had any other/better/different methods.
Thx!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# MonitorDAG.ps1
# Script to monitor DAG in Exchange 2010
#
# Nuno Mota
# Team @MSExchangeGuru
Function sendEmail ([String] $body)
{
$MailMessage = New-Object System.Net.Mail.MailMessage
$MailMessage.From = "[email protected]"
$MailMessage.To.Add("[email protected]")
$MailMessage.Subject = "DAG Not Healthy!"
$MailMessage.Body = $body
$MailMessage.Priority = "High"
$SMTPClient = New-Object System.Net.Mail.SMTPClient
$SMTPClient.Host = "HTCAS1.letsexchange.com"
$SMTPClient.Send($MailMessage)
}
Function getExchangeServerADSite ([String] $excServer)
{
# We could use WMI to check for the domain, but I think this method is
better
# Get-WmiObject Win32_NTDomain -ComputerName $excServer
$configNC=([ADSI]"LDAP://RootDse").configurationNamingContext
$search = new-object
DirectoryServices.DirectorySearcher([ADSI]"LDAP://$configNC")
$search.Filter =
"(&(objectClass=msExchExchangeServer)(name=$excServer))"
$search.PageSize = 1000
[Void] $search.PropertiesToLoad.Add("msExchServerSite")
Try {
$adSite = [String]
($search.FindOne()).Properties.Item("msExchServerSite")
Return ($adSite.Split(",")[0]).Substring(3)
} Catch {
Return $null
}
}
[Bool] $bolFailover = $False
[String] $errMessage = $null
Get-MailboxDatabase | Sort Name | ForEach {
$db = $_.Name
$curServer = $_.Server.Name
$ownServer = $_.ActivationPreference | ? {$_.Value -eq 1}
# Compare the server where the DB is currently active to the server
where it should be
If ($curServer -ne $ownServer.Key)
{
# Compare the AD sites of both servers
$siteCur = getExchangeServerADSite $curServer
$siteOwn = getExchangeServerADSite $ownServer.Key
If ($siteCur -ne $null -and $siteOwn -ne $null -and $siteCur -ne
$siteOwn)
{
$errMessage += "`n$db on $curServer should be on
$($ownServer.Key) (DIFFERENT AD SITE: $siteCur)!"
}
Else
{
$errMessage += "`n$db on $curServer should be on
$($ownServer.Key)!"
}
$bolFailover = $True
}
}
$errMessage += "`n`n"
Get-MailboxServer | Get-MailboxDatabaseCopyStatus | ForEach {
If ($_.Status -notmatch "Mounted" -and $_.Status -notmatch "Healthy"
-or $_.ContentIndexState -notmatch "Healthy")
{
$errMessage += "`n$($_.Name) - Status: $($_.Status) - Index:
$($_.ContentIndexState)"
$bolFailover = $True
}
}
If ($bolFailover)
{
sendEmail $errMessage
#Schtasks.exe /Delete /TN "MonitorDAG" /F
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~