none
Envíos de eventos por smtp RRS feed

  • Pregunta

  • Buenas!!

    Necesito enviar por smtp los eventos de un servidor por remoto, mas concrétamente los errores y advertencias de sistemas y aplicaciones, llevo poco tocando powershell y tengo muchas carencias que me gustaría ir superando, sólo he podido crear esto:

    Get-WinEvent @{logname='application','system';starttime=[datetime]::today;level=2,3 } | format-list *

    el resultado de este código es lo que necesito enviar a una cuenta de correo y si pude ser añadirle -computername(el equipo esta en red) y credenciales de administrador. 

    gracias de antemano.


    jueves, 5 de enero de 2017 18:30

Todas las respuestas

  • Hola Manu...

    No es tan complicado, el envío de correos lo podemos realizar con el cmdlet Send-MailMessage entonces basándonos en un ejemplo básico el bloque de código podría quedar de la siguiente forma:

    Get-WinEvent @{logname='application','system';starttime=[datetime]::today;level=2,3 } | format-list * | Out-File C:\IT\log.txt
    
    $paramHash = @{
     To = "User01 <user01@example.com>"
     from = "User02 <user02@example.com>"
     BodyAsHtml = $True
     Body = "Forgot to send the attachment. Sending now."
     Port = 25
     Subject = "Sending the Attachment"
     Attachments = C:\IT\log.txt
    }
     
    Send-MailMessage @paramHash

    Básicamente salvamos el resultado en un txt y luego lo adjuntamos en el correo que deseas enviar...

     


    Jimcesse
    Principal: http://sysadmin-cr.com/
    Alterno: http://blogs.itpro.es/jimcesse
    

    jueves, 5 de enero de 2017 19:38
  • Gracias Jimcesse por tu pronta respuestas.

    Necesito especificarle las credenciales del usuario de smtp y el parametro computername para poder ejecutarlo por red.

    saludos.

    jueves, 5 de enero de 2017 20:46
  • Ok hay que agregar un par de lineas mas al bloque, algo así: 

    $cred =  New-Object System.Management.Automation.PSCredential -ArgumentList "Nombre de Usuario", (ConvertTo-SecureString -String "Contraseña" -AsPlainText -Force)
    
    
    Get-WinEvent @{logname='application','system';starttime=[datetime]::today;level=2,3 } | format-list * | Out-File C:\IT\log.txt
    
    $paramHash = @{
     To = "User01 <user01@example.com>"
     from = "User02 <user02@example.com>"
     BodyAsHtml = $True
     Body = "Forgot to send the attachment. Sending now."
     Port = 25
     Subject = "Sending the Attachment"
     Attachments = C:\IT\log.txt
     Credential = $cred
    }
     
    Send-MailMessage @paramHash

    Cuando dices que quieres ejecutar el script por red te refieres a varios equipos !? Como le darás los nombres o ips de los equipos al bloque !? Desde un csv o un txt !? 


    Jimcesse
    Principal: http://sysadmin-cr.com/
    Alterno: http://blogs.itpro.es/jimcesse
    

    jueves, 5 de enero de 2017 21:10
  • gracias jimcesse.

    sería para un servidor que está en red.

    al ejecutarlo me da el error:

    Send-MailMessage : No se puede validar el argumento del parámetro 'Attachments'
    . El argumento es NULL o está vacío. Proporcione un argumento que no sea NULL o
     no esté vacío e intente ejecutar el comando de nuevo.

    ¿en ninguna parte del código debo de indicar el servidor smtp?

    un saludo.


    jueves, 5 de enero de 2017 21:32
  • Si claro, se debe agregar :P

    $cred =  New-Object System.Management.Automation.PSCredential -ArgumentList "Nombre de Usuario", (ConvertTo-SecureString -String "Contraseña" -AsPlainText -Force)
    
    
    Get-WinEvent @{logname='application','system';starttime=[datetime]::today;level=2,3 } -ComputerName "Nombre del Servidor" | format-list * | Out-File C:\IT\log.txt
    
    $paramHash = @{
     To = "User01 <user01@example.com>"
     from = "User02 <user02@example.com>"
     BodyAsHtml = $True
     Body = "Forgot to send the attachment. Sending now."
     Port = 25
     Subject = "Sending the Attachment"
     Attachments = "C:\IT\log.txt"
     Credential = $cred
     SmtpServer = "mail.midominio.com"
    }
     
    Send-MailMessage @paramHash

    Saludos,


    Jimcesse
    Principal: http://sysadmin-cr.com/
    Alterno: http://blogs.itpro.es/jimcesse
    

    jueves, 5 de enero de 2017 21:38
  • gracias de nuevo.

    sigue sin salir el mail, pasa los datos al .txt y da el mismo error:

     

    Send-MailMessage : No se puede validar el argumento del parámetro 'Attachments'
    . El argumento es NULL o está vacío. Proporcione un argumento que no sea NULL o
     no esté vacío e intente ejecutar el comando de nuevo.
    En línea: 18 Carácter: 17
    + Send-MailMessage <<<<  @paramHash
        + CategoryInfo          : InvalidData: (:) [Send-MailMessage], ParameterBi 
       ndingValidationException
        + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.Power 
       Shell.Commands.SendMailMessage

    saludos.

    jueves, 5 de enero de 2017 22:00
  • Bueno me parece que el error esta en el valor que hay después del = vistes que en el ejemplo estamos usando la ruta C:\IT\log.txt en tu caso ese archivo existe !? Yo acabo de probar y no me genero ningún problema.

    Jimcesse
    Principal: http://sysadmin-cr.com/
    Alterno: http://blogs.itpro.es/jimcesse
    

    jueves, 5 de enero de 2017 22:12
  • Si existe y se vuelca los datos del eventviwer, te paso el script con los valores que estoy introduciendo:

    $cred =  New-Object System.Management.Automation.PSCredential -ArgumentList "USUARIO SMTP", (ConvertTo-SecureString -String “CONTRASEÑA” -AsPlainText -Force)
    Get-WinEvent @{logname='application','system';starttime=[datetime]::today;level=2,3 } | format-list * | Out-File C:\IT\log.txt
    $paramHash = @{ 
    To = “DIRECCION DEL DESTINATARIO” 
    from = “DIRECCIóN DEL REMITENTE” 
    BodyAsHtml = $True 
    Body = "Forgot to send the attachment. Sending now." 
    Port = 587 
    Subject = "Sending the Attachment" 
    Attachments = C:\IT\log.txt Credential = $cred 
    SmtpServer = "SERVIDOR SMTP"
    } 
    Send-MailMessage @paramHash
    Gracias.


    jueves, 5 de enero de 2017 22:36
  • Solo para descartar esta linea la tienes asi: Attachments = C:\IT\log.txt Credential = $cred porque son 2 parametros diferentes... Otra idea pon C:\IT\log.txt entre comillas dobles "C:\IT\log.txt"

    Jimcesse
    Principal: http://sysadmin-cr.com/
    Alterno: http://blogs.itpro.es/jimcesse
    

    jueves, 5 de enero de 2017 22:42
  • ok, le he añadido las comillas y ahora me indica:

    Send-MailMessage : No se encuentra ningún parámetro que coincida con el nombre d
    el parámetro 'Port'.

    esto se refiere al 587 o a port?

    gracias.

    jueves, 5 de enero de 2017 23:02
  • Agregale comillas tambien :) las comillas le indican a PowerShell que es un string o texto sin ellas podria no entender que valor le estamos indicando.

    Jimcesse
    Principal: http://sysadmin-cr.com/
    Alterno: http://blogs.itpro.es/jimcesse
    

    jueves, 5 de enero de 2017 23:06
  • Perdón, hasta hoy no he podido ponerme con el script. he probado con comillas y de todas formas dándome el mismo error, al final lo he creado de la siguiente forma:

    Get-WinEvent @{logname='application','system';starttime=[datetime]::today;level=2,3 } | format-list * | Out-File C:\IT\log.txt

    $filename = “c:\archivo.log”

    $smtpserver = “smtp.server.com”

    $msg = new-object Net.Mail.MailMessage

    $att = new-object Net.Mail.Attachment($filename)

    $smtp = new-object Net.Mail.SmtpClient($smtpServer )

    $smtp.EnableSsl = $True

    $smtp.Credentials = New-Object System.Net.NetworkCredential(“usuario”, “password”); 

    $msg.From = “it@eventviewer.com

    $msg.To.Add(”destinatario@eventviewer.com”)

    $msg.Subject = “reportes event”

    $msg.Body = “contenido”

    $msg.Attachments.Add($att)

    $smtp.Send($msg)

    con este código no me marca ningún error y me envía correctamente. Para optimizar e ir profundizando mas ¿se podría enviar el resultado de la búsqueda de eventos en el cuerpo del mensaje y no adjuntado? en el campo body.

    gracias y saludos.

    lunes, 9 de enero de 2017 17:47
  • Este último código me da error.

    PS C:\Users\Meta> Get-WinEvent @{logname='application','system';starttime=[datetime]::today;level=2,3 } | format-list * | Out-File C:\IT\log.txt
    
    $filename = “c:\archivo.log”
    
    $smtpserver = “smtp.server.com”
    
    $msg = new-object Net.Mail.MailMessage
    
    $att = new-object Net.Mail.Attachment($filename)
    
    $smtp = new-object Net.Mail.SmtpClient($smtpServer )
    
    $smtp.EnableSsl = $True
    
    $smtp.Credentials = New-Object System.Net.NetworkCredential(“usuario”, “password”);
    
    $msg.From = “it@eventviewer.com
    
    $msg.To.Add(”destinatario@eventviewer.com”)
    
    $msg.Subject = “reportes event”
    
    $msg.Body = “contenido”
    
    $msg.Attachments.Add($att)
    
    $smtp.Send($msg)
    En línea: 19 Carácter: 14
    + $msg.To.Add(”destinatario@eventviewer.com”)
    +              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Token 'destinatario@eventviewer.com”)
    $msg.Subject = “reportes' inesperado en la expresión o la instrucción.
    En línea: 23 Carácter: 23
    + $msg.Body = “contenido”
    +                       ~
    Falta la cadena en el terminador: ".
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : UnexpectedToken


    http://electronica-pic.blogspot.com

    sábado, 21 de enero de 2017 0:59