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 De Alerta Cuando Se Desmontan Bases De Datos De Exchange 2007

Posted by urpiano en Jueves 22 \22\UTC octubre \22\UTC 2009

Cuando no se tiene una herramienta de monitorización como Dios manda, del estilo de SCOM 2007, este tipo de jugadas nos pueden ser útiles para monitorizar nuestros equipos. Es lo que suelo llamar “el SCOM del pobre” :-).

Este script de Powershell nos permite revisar las bases de datos de nuestra organización de Exchange 2007 y si se encuentra alguna no montada envia un mensaje de correo a los destinatarios que se establezcan al llamarlo. Basta crear una tarea programada que lo lance cada x tiempo.

La sintaxis del script es:

<ruta>\alarma-basedatos -Remitente <direccion SMTP> -Destinatarios <array direcciones SMTP> -ServidorSMTP <nombre o IP del servidor de envío>

Siendo:

  • Ruta (requerido): Ruta de la carpeta en la que se encuentra ubicado el script. Powershell requiere que se pase la ruta de los scripts, aunque estos se encuentren en una carpeta incluída en la variable de entorno PATH. En el caso de que el script se encuentre en la carpeta en la que está situado Powershell, es suficiente con poner un punto como ruta.
  • Remitente (requerido): Cadena con la dirección SMTP del remitente del correo que se enviará, si es necesario. La dirección se puede escribir como “Nombre para mostrar” (por ejemplo “Filemon Pi”) o directamente sólo la dirección (“filemon.pi@tia.org”).
  • Destinatarios (requerido): Array de cadenas, con la dirección SMTP de un destinatario en cada elemento del array. La dirección se puede escribir como “Nombre para mostrar” (por ejemplo “Filemon Pi”) o directamente sólo la dirección (“filemon.pi@tia.org”).
  • ServidorSMTP (requerido): IP o nombre DNS o NetBios del servidor SMTP desde el que se enviará el correo, caso de ser necesario su envío.

Ejemplo

En caso de encontrarse un error, se enviará el mensaje a Ofelia, el Super y Filemón, mensaje cuyo remitente será Mortadelo y será enviado usando el servidor SMTP bacterio-smtp:

.\alarma-basedatos -Remitente “mortadelo@tia.org” -Destinatarios “Filemon Pi”,”El Super”,”ofelia@tia.org” -ServidorSMTP “bacterio-smtp”

Este es el código del script:

################################################################################
#                                                                              #
# alarma-basedatos.ps1                                                         #
#                                                                              #
# Este script revisa si todas las bases de datos de la organización de         #
# Exchange estan montadas. En el caso de no estar montada una o varias,        #
# mandará un mensaje de correo electrónico advirtiéndolo. Está pensado para    #
# ser ejecutado como tarea programada y así avisar en el caso de haber un      #
# problema.                                                                    #
#                                                                              #
# Esta es la sintaxis del script:                                              #
#                                                                              #
# <ruta>\alarma-basedatos -Remitente <direccion SMTP> `                        #
#                         -Destinatarios <array direcciones SMTP>              #
#                         -ServidorSMTP <nombre o IP del servidor de envío)>   #
#                                                                              #
# Siendo:                                                                      #
#                                                                              #
#         - Ruta (requerido):                                                  #
#                             Ruta de la carpeta en la que se encuentra        #
#                             ubicado el script. Powershell requiere que se    #
#                             pase la ruta de los scripts, aunque estos se     #
#                             encuentren en una carpeta incluída en la         #
#                             variable de entorno PATH. En el caso de que el   #
#                             script se encuentre en la carpeta en la que está #
#                             situado Powershell, es suficiente con poner un   #
#                             punto como ruta.                                 #
#                                                                              #
#         - Remitente (requerido):                                             #
#                             Cadena con la dirección SMTP del remitente del   #
#                             correo que se enviará, si es necesario. La       #
#                             dirección se puede escribir como "Nombre para    #
#                             mostrar<dirección SMTP>" (por ejemplo "Filemon   #
#                             Pi<filemon.pi@tia.org>") o directamente sólo la  #
#                             dirección ("filemon.pi@tia.org").                #
#                                                                              #
#         - Destinatarios (requerido):                                         #
#                             Array de cadenas, con la dirección SMTP de un    #
#                             destinatario en cada elemento del array. La      #
#                             dirección se puede escribir como "Nombre para    #
#                             mostrar<dirección SMTP>" (por ejemplo "Filemon   #
#                             Pi<filemon.pi@tia.org>") o directamente sólo la  #
#                             dirección ("filemon.pi@tia.org").                #
#                                                                              #
#         - ServidorSMTP (requerido):                                          #
#                             IP o nombre DNS o NetBios del servidor SMTP      #
#                             desde el que se enviará el correo, caso de ser   #
#                             necesario su envío.                              #
#                                                                              #
# Ejemplo                                                                      #
#                                                                              #
# Se revisará el estado de las bases de datos de Exchange y en caso de         #
# encontrar al menos una que no esté montada se enviará un correo a Filemón y  #
# al superintedente Vicente remitido por Mortadelo; para enviar el correo se   #
# usará el servidor bacterio-smtp:                                             #
#                                                                              #
# .\alarma-basedatos -Remitente "mortadelo@tia.org" `                          #
#                    -Destinatarios "Filemon Pi<filemon.pi@tia.org>",`         #
#                                   "El Super<svicente@tia.org>" `             #
#                    -ServidorSMTP "bacterio-smtp"                             #
#                                                                              #
#                                                                              #
# Fernando Reyes López                                                         #
# Octubre de 2009                                                              #
#                                                                              #
################################################################################

# Declaramos los parámetros de entrada
param($Remitente,$Destinatarios,$ServidorSMTP)

Function f_Mail
################################################################################
#                                                                              #
# Esta función envía un mensaje de correo con el asunto, cuerpo, destinatarios,#
# remitente y servidor de envío como parámetros de entrada.                    #
#                                                                              #
################################################################################

# Declaración de parámetros de la función
{param($De, $Para, $Asunto, $Cuerpo, $SmtpServer)

    # Creamos un objeto mensaje de correo
    $Mensaje = New-Object Net.Mail.MailMessage
    
    # Creamos un objeto cliente de correo y establecemos su servidor de correo
    # SMTP
    $SMTP = New-Object Net.Mail.SmtpClient($SmtpServer)

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

    # En este bucle vamos añadiendo los diferentes destinatarios del mensaje
    ForEach($Destinatario In $Para)
    {
        # Agregamos el destinatario actual
        $Mensaje.To.Add($Destinatario)
    }

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

    # Marcamos el mensaje con prioridad alta (2 corresponde a           
    # System.Net.Mail.MailPriority.High)
    $Mensaje.Priority = 2
    
    # Enviamos el mensaje
    $SMTP.Send($Mensaje)

}

# Comprobamos si están cargados los Cmdlets de Exchange. En caso contrario los
# cargamos.
If(!(Get-PSSnapin | `
     Where-Object {$_.Name -eq `
                    "Microsoft.Exchange.Management.PowerShell.Admin"`
                    }))
{
    Add-PSSnapin -name Microsoft.Exchange.Management.PowerShell.Admin
}

# 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 mificador -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"

            }
        } # $BD
    } # $Almacen
} # $Servidor

# Si la variable de salida contiene algo, significa que hay al menos una base
# de datos desmontada y por tanto se tiene que enviar un mensaje de correo
If ($Salida.Length -gt 0)
{

    # 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 $Remitente `
           -Para $Destinatarios `
           -Asunto $Asunto `
           -Cuerpo $Cuerpo `
           -SmtpServer $ServidorSMTP

}

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: