El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

Script Powershell Para Enviar Una Alerta Si Hay Bases De Datos De Exchange 2007 Desmontadas

Posted by urpiano en Lunes 18 \18\UTC octubre \18\UTC 2010

Este script de PowerShell revisa el estado de las bases de datos de la organización de Exchange donde es lanzado, y en el caso de que al menos una no esté montada, envía un correo advirtiendo de ello. La idea para su uso es crear una tarea programada que se lanza cada cierto tiempo (digamos que es como una alerta de SCOM pero para pobres :-)). Se debe lanzar desde un servidor de Exchange.

Éste es el código del script

#######################################################################
#                                                                     #
# Este script revisa si todas las bases de datos de la organización   # 
# de Exchange estan montadas, mostrando si están o no montadas.       #
# en el caso de no estar montada una o varias, mandará un mensaje de  #
# correo electrónico advirtiendolo                                    #
#                                                                     #
# Fernando Reyes López                                                #
# Octubre de 2009                                                     #
#                                                                     #
#######################################################################


Function f_Mail
{param($De, $Para, $Asunto, $Cuerpo, $SmtpServer)
#######################################################################
#                                                                     #
# Esta función envía un mensaje de correo. Recive como parámetros:    #
#                                                                     #
#   - $De: remitente del correo en formato SMTP, es decir, que puede  #
#          ser de la forma "Nombre para mostrar<direccion de correo>" #
#          (por ejemplo "Filemón Pi<fpi@tia.org>") o de la forma      #
#          "dirección de correo" (por ejemplo "fpi@tia.org")          #
#                                                                     #
#   - $Para: Array con la lista de destinatarios del correo en        #
#          formato SMTP; es decir, que cada  dirección sigue la misma #
#          nomenclatura que se ha explicado en el parámetro $De       #
#                                                                     #
#   - $Asunto: Texto con el asunto del correo                         #
#                                                                     #
#   - $Cuerpo: Texto con el cuerpo del mensaje                        #
#                                                                     #
#   - $SmtpServer: Servidor de correo saliente; puede ser un nombre   #
#           FQDN, NetBios o una IP                                    #
#                                                                     #
#######################################################################

    # Creamos un objeto mensaje de correo
    $Mensaje = New-Object Net.Mail.MailMessage
,
    # Creamos un objeto cliente de mail, que conecta al servidor
    # recibido como parámetro
    $SMTP = New-Object Net.Mail.SmtpClient($SmtpServer)

    # Establecemos el remitente del mensaje
    $Mensaje.From = $De

    # Con este bucle se recorren los destinatarios del array $Para
    ForEach($Destinatario In $Para)
    {
        # Agregamos el destinatario actual al mensaje
        $Mensaje.To.Add($Destinatario)
    }

    # Establecemos el asunto del mensaje
    $Mensaje.Subject = $Asunto

    # Establecemos el texto del mensaje
    $Mensaje.Body = $Cuerpo

    # Establecemos la prioridad del mensaje:
    # 2 corresponde a System.Net.Mail.MailPriority.High
    $Mensaje.Priority = 2

    # Enviamos el mensaje
    $SMTP.Send($Mensaje)

}

# Agregamos los Cmdlets de Exchange a la consola
Add-PsSnapin *exchange*


# Obtenemos los servidores de la organización
ForEach($Servidor In Get-MailBoxServer)
{

    # Obtenemos los grupos de almacenamiento del servidor
    ForEach($Almacen In Get-StorageGroup -Server $Servidor)
    {

        # Obtenemos las bases de datos del grupo de almacenamiento.
        # Observesé que hemos pasado el moficador -Status al Cmdlet
        # Get-MailBoxDatabase; esto es debido a que si no se pasa no
        # se obtiene si está o no montada la base de datos
        ForEach($BD In Get-MailBoxDatabase -Storagegroup $Almacen `
                                           -status)
        {

            # Comprobaremos si está o no montada, almacenando el
            # resultado
            If($BD.Mounted -eq $True)
            {

                $Montada = "Montada"

            }
            Else
            {

                $Montada = "No montada"

                # Montamos la línea de salida
                $Salida = $Salida + `
     "==============================================`r`n" + `
     "Servidor: " + $BD.ServerName + "`r`n" + `
     "Grupo de almacenamiento: " + $BD.StorageGroupName + "`r`n" + `
     "Base de datos: " + $BD.Name + "`r`n" + `
     "Estado: " + $Montada + "`r`n" + `
     "==============================================`r`n`r`n"


            } #If($BD.Mounted -eq $True)


        }

    } # $Almacen

} # $Servidor

# Si la línea de salida está vacía, significa que no hay ninguna base
# de datos desmontada y por tanto el script debe terminar sin más; en
# caso contrario hay que enviar un mensaje
If ($Salida.Length -gt 0)
{

    # Establecemos los destinatarios
    $Destinatarios = "Filemón Pi<fpi@tia.org>", `
                     "Superintendente Vicente<svicente@tia.org>", `
                     "mortadelo@tia.org"

    # Obtenemos la fecha
    $Fecha = Get-Date

    # Establecemos el asunto
    $Asunto = "Alerta de base/s de datos no montada/s - " + $Fecha.Datetime

    # Establecemos el cuerpo del mensaje
    $Cuerpo = "Se ha/n detectado la/s siguiente/s base/s de datos " + `
              "no montada/s:`r`n`r`n`r`n" + `
              $Salida + `
              "Se recomienda que la/s base/s de datos sean " + `
              "montada/s lo antes posible, y se verifique " + `
              "a continuación su estado."

    # Enviamos el mensaje de correo
    f_Mail -De "Profesor Bacterio<pbacterio@tia.org>" `
           -Para $Destinatarios `
           -Asunto $Asunto `
           -Cuerpo $Cuerpo `
           -SmtpServer "smtp.tia.org"


} #If ($Salida.Length -gt 0)

2 comentarios to “Script Powershell Para Enviar Una Alerta Si Hay Bases De Datos De Exchange 2007 Desmontadas”

  1. Josele said

    Mil gracias! a ver si con ayudas de este tipo voy mejorando en PowerShell script.

    Por cierto…. añade otros mil millones de gracias más al saco por alegrarme la infancia con vuestros electroduendes, muñegotes y demás. Grande… muy grande. ¿Todavía hacéis talleres? ;)

    El Jim Henson Español es informático… que fuerte.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: