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…

Crear Una Alerta Y Enviar Un Correo Cuando Se Produce

Posted by urpiano en viernes 8 \08\+01:00 junio \08\+01:00 2007

El establecer una alerta es algo muy útil en determinadas ocasiones. Por ejemplo, queremos saber cuándo nos estamos quedando bajos de espacio en disco. En la herramienta administrativa Rendimiento, podemos crear alertas cuando determinado contador del equipo alcance determinado umbral; una vez alcanzado podemos recibir un mensaje de consola y/o ejecutar un programa. Por desgracia, no permite enviar un correo advirtiendo de la alerta, lo cual sería muy útil. Para poder enviar ese correo es necesario un programa para lanzar un script VBScript que envíe el correo. Veremos cómo crear la alerta y también el script en sí.

Para crear la alerta necesitamos abrir la herramienta Rendimiento, en el panel del árbol expandir el nodo Registros y alertas de rendimiento, hacer click derecho sobre el nodo Alertas y ejecutar Nueva configuración de alerta…

Se abre el cuadro de diálogo Nueva Alerta donde escribimos el nombre de la alerta, en el ejemplo Disco C 2 GB

Ahora se abre el cuadro de diálogo de la alerta Disco C 2 GB, donde podemos poner un comentario, en el ejemplo Esta alerta envía un correo cuando el disco C tiene menos de 2 GB libres. Una vez escrito el comentario, vamos a agregar el contador que nos permitirá detectar el espacio que queda libre en C. Para ello pulsamos el botón Agregar…

Se abre el cuádro de diálogo Agregar contadores, donde podemos añadir tantos contadores como necesitemos. En nuestro caso sólo añadiremos uno. En el desplegable Objeto de rendimiento seleccionamos DiscoLógico, con la opción Seleccionar contadores de la lista marcada, en la lista de debajo seleccionamos el contador Megabytes libres, con la opción Seleccionar instancias de la lista marcada, en la lista de debajo seleccionamos C:, pulsamos el botón Agregar y a continuación el botón Cerrar

Una vez seleccionado el contador, establecemos el umbral por el cual se lanzará la alerta. Para ello, en el desplegable Alertar cuando el valor sea, seleccionamos Inferior a y en la caja de texto Límite escribimos 2048. Ahora vamos a establecer cada cuánto tomará datos la alerta; para ello en Tomar datos de muestra cada, caja de texto Intervalo, escribimos 1 y en el desplegable Unidades seleccionamos Horas, de esa manera se lanzará cada hora. A continuación pasamos a la pestaña Acción

Es en esta pestaña en la que estableceremos que se envíe el correo. Para ello, activamos la casilla de verificación Ejecutar este programa y establecemos wscript como programa a lanzar, bien escribiendo la ruta completa o navegando con el botón Examinar hasta %WinDir%\system32. No se puede ejecutar diréctamente el script, es necesario pasarlo como parámetro del ejecutable (wscript.exe); por ello debemos pulsar el botón Argumentos de la línea de comandos

Se abre el cuádro de diálogo Argumentos de la línea de comandos. Desmarcamos todas las casillas de verificación que están marcadas y marcamos la casilla Mensaje de texto, lo que habilita la caja de texto en la que debemos poner la ruta y el nombre del script. Aquí es donde biene el truqi: como se encierra de modo automático el nombre del script y como el script recibe como parámetros el destinatario, remitente, asunto y cuerpo, dado que el asunto y el cuerpo van a contener espacios ¿cómo podemos encerrar entre comillas los parámetros? La respuesta es poner unas comillas después del nombre del script, para que así cierren las iniciales que se ponen de forma predeterminada y podamos abrir y cerrar la que necesitemos, eso sí, el último parámetro debe de abrir siempre comillas y no debe cerrarlas. En el ejemplo la línea que se pone es C:\Documents and Settings\Administrador\Mis documentos\mail.vbs" /F:"Administrador de Red<administrador@dominio.com>" /T:"El Más Guapo Del Universo<freyes@dominio.com>" /S:"Alerta en SERVIDOR" /B:"Alerta de espacio en C:\n\nMenos de 2 GB libres en el disco C de SERVIDOR. Una vez escrito el texto, pulsamos el botón Aceptar

Esto nos lleva de nuevo al cuadro de diálogo de la alerta, donde observamos en Ejemplo de argumentos de la línea de comandos que aparecen los argumentos que hemos puesto. Pulsamos el botón Aceptar

Se abre el cuadro de diálogo Establecer contraseña, donde debemos suministrar las credenciales del usuario que lanzará la alerta, por ejemplo el administrador, y pulsamos el botón Aceptar

Ya está creada la tarea y podemos verla en el panel de detalle de la consola de administración de rendimiento

El Script mail.vbs

Script VBScript que permite enviar un correo usando un servidor de correo externo al equipo

Sintaxis

{wscript | cscript [//nologo]} mail.vbs [/?] /D:remitente /P:destinatario /A:asunto /C:cuerpo

Siendo

Parámetro ¿Requerido? Descripción
/? No
Muestra la ayuda en línea.
/D
Remitente del mensaje. Se debe pasar con el formato
"Nombre para mostrar<email>", por ejemplo "Saurón<sauron@mordor.gob>"
/P
Destinatario del mensaje. Se debe pasar con el formato
"Nombre para mostrar<email>", por ejemplo "Gandalf<gandalf@magos.org>"
/A
Asunto del mensaje
/C
Cuerpo del mensaje. Permite establecer saltos de línea
el texto, escribiéndolos como \n

Ejemplo

cscript //nologo /d:"Peregrim Tuk<peregrimt@losgamos.org>" /p:"Meriadoc Brandigamo<meriadocb@losgamos.org>" /a:"¿Quedamos …" /c:"…para comer y beber cerveza?\n\nSalu2"

Este es el código del script

'mail.vbs
'
'Script VBScript que permite enviar un correo usando
'un servidor de correo externo al equipo
'
'Sintaxis
'
'{wscript | cscript [//nologo]} mail.vbs [/?] /D:remitente
'     /P:destinatario /A:asunto /C:cuerpo
'
'Siendo
'
'  - ?: parámetro opcional; si se incluye muestra la ayuda
'       en línea y termina el script
'
'  - D: parámetro requerido; remitente del mensaje. Se debe
'       pasar con el formato "Nombre para mostrar<email>",
'       por ejemplo "Saurón<sauron@mordor.gob>"
'
'  - P: parámetro requerido; destinatario del mensaje. Se debe
'       pasar con el formato "Nombre para mostrar<email>",
'       por ejemplo "Gandalf<gandalf@magos.org>"
'
'  - A: parámetro requerido; asunto del mensaje
'
'  - C: parámetro requerido; cuerpo del mensaje. Permite
'       establecer saltos de línea el texto, escribiéndolos
'       como \n
'
'Ejemplo
'
'cscript //nologo mail.vbs /d:"Peregrim Tuk<peregrimt@losgamos.org>"
'          /p:"Meriadoc Brandigamo<meriadocb@losgamos.org>"
'/a:"¿Quedamos ..." /c:"...para comer y beber cerveza?\n\nSalu2"
'
'© Fernando Reyes - Junio 2007

Option Explicit

Dim obj_Email, str_De, str_Para
Dim str_Asunto, str_Cuerpo
Dim str_Usuario, str_Clave
Dim str_Error

'Iniciamos la variable de mensaje de error
'como cadena vacía
str_Error = ""

'Si se ha pedido la ayuda
If WScript.Arguments.Named.Exists("?") Then

    'Se muestra y...
    Call s_Ayuda(str_Error)
    
    'se finaliza el script
    WScript.Quit 0
    
End If

'Si no se ha recibido remitente se recoge en la
'variable de mensaje de error
If Not WScript.Arguments.Named.Exists("D") Then 

    str_Error = str_Error & _
               "No se ha especificado el " & _
                "remitente" & vbCrLf
                
Else

    'Recogemos el remitente
    str_De = WScript.Arguments.Named("D")
                
End If

'Si no se ha recibido destinatario se recoge en la
'variable de mensaje de error
If Not WScript.Arguments.Named.Exists("P") Then 

    str_Error = str_Error & _
               "No se ha especificado el " & _
                "destinatario" & vbCrLf
                
Else

    'Recogemos el destinatario
    str_Para = WScript.Arguments.Named("P")
                
End If

'Si no se ha recibido el asunto se recoge en la
'variable de mensaje de error
If Not WScript.Arguments.Named.Exists("A") Then 

    str_Error = str_Error & _
               "No se ha especificado el " & _
                "asunto del mensaje" & vbCrLf
                
Else

    'Recogemos el asunto
    str_Asunto = WScript.Arguments.Named("A")
                
End If

'Si no se ha recibido el cuerpo se recoge en la
'variable de mensaje de error
If Not WScript.Arguments.Named.Exists("C") Then 

    str_Error = str_Error & _
               "No se ha especificado el " & _
                "cuerpo del mensaje" & vbCrLf
                
Else

    'Recogemos el cuerpo, sustituyendo los \n
    'por saltos de linea, poniendo al principio
    'el remitente, el destinatario, la fecha y
    'la hora
    str_Cuerpo = "De: " & str_De & vbCrLf & _
                 "Para: " & str_Para & vbCrLf & _
                 "Fecha: " & Date & vbCrLf & _
                 "Hora: " & Time & vbCrLf & vbCrLf & _
                 Replace(WScript.Arguments.Named("C"), _
                         "\n",vbCrLf)
                
End If

If Len(str_Error) > 0 Then

    Call s_Ayuda("Error 1: no se han pasado los a" & _
                "rgumentos requeridos:" & _
                vbCrLf & vbCrLf & str_Error)
    WScript.Quit 1
    
End If         

'Creamos el objeto Mensaje de correo
Set obj_Email = CreateObject("CDO.Message")

'Establecemos el remitente
obj_Email.From = str_De

'Establecemos el destinatario
obj_Email.To = str_Para

'Establecemos el asunto
obj_Email.Subject = str_Asunto 

'Establecemos el cuerpo del mensaje
obj_Email.Textbody = str_Cuerpo

'Configuramos ahora los parámetros de envío

'Especificamos que el servidor SMTP no está en el
'propio equipo desde el que se envía el correo
'Un valor de 1 significa que usaremos el servidor
'SMTP del propio equipo y un valor de dos
'que utilizaremos uno externo; por ello ponemos de
'valor 2
obj_Email.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configu" & _
                            "ration/sendusing") = 2

'Especificamos la URL o la IP del servidor SMTP
'Que cada uno ponga aquí el que corresponda
obj_Email.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configu" & _
                            "ration/smtpserver") = _
        "smtp.dominio.com" 

'Especificamos el puerto por el que está el servidor
'SMTP (por defecto el 25)
obj_Email.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configu" & _
                       "ration/smtpserverport") = 25

'Especificamos el tipo de autenticación: 0 sin
'autenticación, 1 con autenticación básica (texto
'plano) y 2 con autenticación NTLM. Usaremos
'autenticación básica. Si el servidor requiere
'otra, deberás cambiar a lo que necesites
obj_Email.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configu" & _
                      "ration/smtpauthenticate") = 1

'Especificamos si se usará SSL para el envío,
'en el ejemplo no se usará. Si es necesario usar
'SSL, cambiar a True
obj_Email.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configu" & _
                      "ration/smtpusessl") = False

'Especificamos el nombre del usuario para autenticar
'en el servidor SMTP                      
obj_Email.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configu" & _
                 "ration/sendusername") = "usuario"
                 
'Especificamos la contraseña
obj_Email.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configu" & _
                "ration/sendpassword") = "contraseña"

'Actualizamos la configuración de envío del objeto
'CDO.Message
obj_Email.Configuration.Fields.Update

'Enviamos el correo
obj_Email.Send

'Limpiadita de culete :-)
Set obj_Mensaje = Nothing


Sub s_Ayuda(str_Error)

    If Len(str_Error) > 0 Then
    
        WScript.Echo str_Error & vbCrLf & vbCrLf
        
    End If
    
    WScript.Echo "mail.vbs"
    WScript.Echo ""
    WScript.Echo "Script VBScript que p" & _
                 "ermite enviar un corr" & _
                 "eo usando"
    WScript.Echo "un servidor de correo" & _
                 " externo al equipo"
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "{wscript | cscript [/" & _
                 "/nologo]} mail.vbs [/" & _
                 "?] /D:remitente"
    WScript.Echo "     /P:destinatario " & _
                 "/A:asunto /C:cuerpo"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "  - ?: parámetro opci" & _
                 "onal; si se incluye m" & _
                 "uestra la ayuda"
    WScript.Echo "       en línea y ter" & _
                 "mina el script"
    WScript.Echo ""
    WScript.Echo "  - D: parámetro requ" & _
                 "erido; remitente del " & _
                 "mensaje. Se debe"
    WScript.Echo "       pasar con el f" & _
                 "ormato ""Nombre para " & _
                 "mostrar<email>"","
    WScript.Echo "       por ejemplo """ & _
                 "Saurón<sauron@mordor." & _
                 "gob>"""
    WScript.Echo ""
    WScript.Echo "  - P: parámetro requ" & _
                 "erido; destinatario d" & _
                 "el mensaje. Se debe"
    WScript.Echo "       pasar con el f" & _
                 "ormato ""Nombre para " & _
                 "mostrar<email>"","
    WScript.Echo "       por ejemplo """ & _
                 "Gandalf<gandalf@magos" & _
                 ".org>"""
    WScript.Echo ""
    WScript.Echo "  - A: parámetro requ" & _
                 "erido; asunto del men" & _
                 "saje"
    WScript.Echo ""
    WScript.Echo "  - C: parámetro requ" & _
                 "erido; cuerpo del men" & _
                 "saje. Permite"
    WScript.Echo "       establecer sal" & _
                 "tos de línea el texto" & _
                 ", escribiéndolos"
    WScript.Echo "       como \n"
    WScript.Echo ""
    WScript.Echo "Ejemplo"
    WScript.Echo ""
    WScript.Echo "cscript //nologo mail.vbs " & _
	             "/d:""" & _
                 "Peregrim Tuk<peregrim" & _
                 "t@losgamos.org>"""
    WScript.Echo "          /p:""Meriad" & _
                 "oc Brandigamo<meriado" & _
                 "cb@losgamos.org>"""
    WScript.Echo "/a:""¿Quedamos ..."" " & _
                 "/c:""...para comer y " & _
                 "beber cerveza?\n\nSal" & _
                 "u2"""
    WScript.Echo ""


End Sub 's_Ayuda

13 respuestas to “Crear Una Alerta Y Enviar Un Correo Cuando Se Produce”

  1. Gura said

    Gracias, en este momento exactamente me será de mucha ayuda ;)

  2. urpiano said

    Me alegra que pueda hacer algo más que hacerte reir de vez en cuando :-)

  3. Rober said

    Muy interesante… gracias :)

  4. Muchas gracias! googleando me salio tu web! increible me la estoy leyendo de pe a pa! gracias por estos códigos tan wenos y útiles!

    :D

  5. Juan Arias said

    Gracias !!!!!!!!!!!!!

    Te pregunto y disculpa mi ignorancia, como reemplazo mis servidores?

    ‘Especificamos la URL o la IP del servidor SMTP
    ‘Que cada uno ponga aquí el que corresponda
    obj_Email.Configuration.Fields.Item _
    («http://schemas.microsoft.com/cdo/configu» & _ «ration/smtpserver») = _
    «smtpmed.une.net.co»

    Gracias por tu ayuda

  6. Sesso said

    Great site.

  7. Joel said

    Excelente post. Fue muy útil el codigo.

  8. nahuel said

    Muchas gracias, la verdad el vbs y la explicacion me vinieron como anillo al dedo.

  9. Luis Gutierrez said

    Hola Que tal.

    EStoy buscando exactamente lo mismo pero para Windows 2008 Server, alguien sabe como crear las alertas? puedo usar el mismo codigo para el envio de correos?

    Gracias

  10. francisco franco said

    Lo necesito para windows server 2008 en 2003 anda sin problemas pero no encuentro como en 2008

  11. Jose said

    Esto es para crear un .bat??
    Yo lo que busco es un ejecutable para que cada vez que se reinice el servidor, se me notifique con mail.
    Un saludo.

  12. muchas gracias me sirvio mucho. Utilizo una plataforma de integración de datos Powercenter y logré generando este .vbs para su ejecucion directa en esta enviandole los parametros. además le sume un adjunto incluyendo otra variable y funciono.
    saludos

Replica a Sesso Cancelar la respuesta