Anuncio

Colapsar
No hay anuncio todavía.

[TIP] Enviar correos directamente desde POWERSHELL

Colapsar
X
 
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes

  • [TIP] Enviar correos directamente desde POWERSHELL

    Hace unos días me surgió la necesidad de enviar correos de una forma rápida desde una maquina de la red local cuando se enciende. Enviarlos de una manera sencilla, sin tener instalado nada de correo y que me comunicase su hora de conexión, nombre de maquina y la IP que tiene la maquina en ese momento. La solución es sencilla, un script de powershell lo permite.

    Os dejo un ejemplo de esto, enviado usando una cuenta de gmail, que es lo que aconsejo, ya que gmail permite estos reenvíos directamente. EL problema es que gmail usa seguridad, por lo cual voy a dejar abajo el script completo, incluso enviando un adjunto que lo realiza.

    Igualmente necesitamos poner la password de gmail, y esto no me gusta dejarlo en un script, por lo cual se debe dejar en un fichero encriptado. Para ello, y suponiendo que vamos a dejar los scripts en la carpeta c:\util\ps (cambiarlo si es necesario), lo primero que ejecutamos en un powrshell es:

    Código:
    "tu password gmail" | Convertto-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-file "c:\util\ps\pw-ccif1.txt"
    Poner en 'tu password gmail' la password de vuestra cuenta de gmail. Esto dejará encriptada la password en el fichero c:\util\ps\pw-ccif.txt (podeis entrar a mirarlo, y ver lo que ha dejado). La encriptacion es "por maquina", es decir hay que ejecutarlo en las maquinas que queramos usar el script y no copiarlo desde otra maquina. Solo, evidentemente hay que hacerlo una vez.

    El script para envío, es:

    Código:
    <#
    Previamente: (hacerlo por fuera una sola vez por maquina)
    
        "tu password" | Convertto-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-file "c:\util\ps\pw-ccif1.txt"
    
    Ejecutar como:
    
        powershell -executionpolicy remotesigned -File C:\util\ps\correops.ps1
    
    #>
    $scriptpath = $MyInvocation.MyCommand.Path
    $dir = Split-Path $scriptpath
    #
    $EmailPropio = "tucuentadegmail@gmail.com";
    $EmailDestino = "cuentadestinocorreo@loquesea.com";
    #
    $Asunto = "Conexion: $env:computername $((Get-Date).ToString())"
    $Texto = "Conectado desde $env:computername a las $((Get-Date).ToString())"
    #
    $ServidorSMTP = "smtp.gmail.com"
    $Archivo = "$dir\ipps.txt"
    Get-NetIPAddress -AddressFamily ipv4 | ft IPAddress, InterfaceAlias | out-file -filepath $Archivo
    $Adjunto = New-Object Net.Mail.Attachment($Archivo)
    $password = Get-Content "$dir\pw-ccif1.txt" | Convertto-SecureString
    ##
    ##
    $Mensaje = New-Object System.Net.Mail.MailMessage
    $Mensaje.From = $EmailPropio
    $Mensaje.To.Add($EmailDestino)
    $Mensaje.IsBodyHtml = $True
    $Mensaje.Subject = $Asunto
    $Mensaje.Body = $Texto
    $Mensaje.Attachments.Add($Adjunto)
    $ClienteSMTP = New-Object Net.Mail.SmtpClient($ServidorSMTP, 587)
    $ClienteSMTP.EnableSsl = $true
    $ClienteSMTP.Credentials = New-Object System.Net.NetworkCredential($EmailPropio, $password);
    $ClienteSMTP.Send($Mensaje)
    Guardarlo como C:\util\ps\correops.ps1

    Y para ejecutarlo, podeis hacerlo con:

    powershell -executionpolicy remotesigned -File C:\util\ps\correops.ps1

    Si quereis que se ejecuta de forma automatica, ponerlo en el inicio de windows.

    Evidentmente debeis cambiar en él;
    $EmailPropio = "tucuentadegmail@gmail.com";
    $EmailDestino = "cuentadestinocorreo@loquesea.com";


    (puede ser el mismo).

    NOTA: si cuando envieis, falla el script en la ultima linea(en el envio de mensaje) es porque no teneis configurada vuestra cuenta para permitir envios de clientes que gmail llama "no seguros"... es decir, desconocidos para él. Recibireis admeas una alerta de gamil diciendo que alguien lo quiere usar. Para solventar este problema reconfigurarlo en vuestra cuenta de gmail: https://support.google.com/accounts/.../6010255?hl=es

  • #2
    Originalmente publicado por jmtella Ver Mensaje
    Hace unos días me surgió la necesidad de enviar correos de una forma rápida desde una maquina de la red local cuando se enciende. Enviarlos de una manera sencilla, sin tener instalado nada de correo y que me comunicase su hora de conexión, nombre de maquina y la IP que tiene la maquina en ese momento. La solución es sencilla, un script de powershell lo permite.

    Os dejo un ejemplo de esto, enviado usando una cuenta de gmail, que es lo que aconsejo, ya que gmail permite estos reenvíos directamente. EL problema es que gmail usa seguridad, por lo cual voy a dejar abajo el script completo, incluso enviando un adjunto que lo realiza.

    Igualmente necesitamos poner la password de gmail, y esto no me gusta dejarlo en un script, por lo cual se debe dejar en un fichero encriptado. Para ello, y suponiendo que vamos a dejar los scripts en la carpeta c:\util\ps (cambiarlo si es necesario), lo primero que ejecutamos en un powrshell es:

    Código:
    "tu password gmail" | Convertto-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-file "c:\util\ps\pw-ccif.txt"
    Poner en 'tu password gmail' la password de vuestra cuenta de gmail. Esto dejará encriptada la password en el fichero c:\util\ps\pw-ccif.txt (podeis entrar a mirarlo, y ver lo que ha dejado). La encriptacion es "por maquina", es decir hay que ejecutarlo en las maquinas que queramos usar el script y no copiarlo desde otra maquina. Solo, evidentemente hay que hacerlo una vez.

    El script para envío, es:

    Código:
    <#
    Previamente:
    
    "tu password" | Convertto-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-file "c:\util\ps\pw-ccif.txt"
    
    Ejecutar como:
    
    powershell -executionpolicy remotesigned -File C:\util\ps\correops.ps1
    
    #>
    $scriptpath = $MyInvocation.MyCommand.Path
    $dir = Split-Path $scriptpath
    #
    $EmailPropio = "tucuentadegmail@gmail.com";
    $EmailDestino = "cuentadestinocorreo@loquesea.com";
    #
    $Asunto = "Conexion: $env:computername $((Get-Date).ToString())"
    $Texto = "Conectado desde $env:computername a las $((Get-Date).ToString())"
    #
    $ServidorSMTP = "smtp.gmail.com"
    $Archivo = "$dir\ipps.txt"
    Get-NetIPAddress -AddressFamily ipv4 | ft IPAddress, InterfaceAlias | out-file -filepath $Archivo
    $Adjunto = New-Object Net.Mail.Attachment($Archivo)
    $password = Get-Content "$dir\pw-ccif1.txt" | Convertto-SecureString
    ##
    ##
    $Mensaje = New-Object System.Net.Mail.MailMessage
    $Mensaje.From = $EmailPropio
    $Mensaje.To.Add($EmailDestino)
    $Mensaje.IsBodyHtml = $True
    $Mensaje.Subject = $Asunto
    $Mensaje.Body = $Texto
    $Mensaje.Attachments.Add($Adjunto)
    $ClienteSMTP = New-Object Net.Mail.SmtpClient($ServidorSMTP, 587)
    $ClienteSMTP.EnableSsl = $true
    $ClienteSMTP.Credentials = New-Object System.Net.NetworkCredential($EmailPropio, $password);
    $ClienteSMTP.Send($Mensaje)
    Guardarlo como C:\util\ps\correops.ps1

    Y para ejecutarlo, podeis hacerlo con:

    powershell -executionpolicy remotesigned -File C:\util\ps\correops.ps1

    Si quereis que se ejecuta de forma automatica, ponerlo en el inicio de windows.

    Evidentmente debeis cambiar en él;
    $EmailPropio = "tucuentadegmail@gmail.com";
    $EmailDestino = "cuentadestinocorreo@loquesea.com";


    (puede ser el mismo).

    NOTA: si cuando envieis, falla el script en la ultima linea(en el envio de mensaje) es porque no teneis configurada vuestra cuenta para permitir envios de clientes que gmail llama "no seguros"... es decir, desconocidos para él. Recibireis admeas una alerta de gamil diciendo que alguien lo quiere usar. Para solventar este problema reconfigurarlo en vuestra cuenta de gmail: https://support.google.com/accounts/.../6010255?hl=es
    Funciona, pero falta un "1" en pw-ccif.txt según el segundo script.:
    "tu password gmail" | Convertto-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-file "c:\util\ps\pw-ccif1.txt"

    El script es para SMTP con SSL (puerto 587)
    Yo envio por SMTP con TLS (puerto 465) desde outlook

    Pero si cambio en el script
    $ClienteSMTP = New-Object Net.Mail.SmtpClient($ServidorSMTP, 465)
    $ClienteSMTP.EnableTls = $true



    Me incluye toda las interfaces de red, no solo la que envia.:

    ipps.txt.:
    192.168.220.1 VMware Network Adapter VMnet8
    169.254.41.240 Conexión de área local* 2
    192.168.127.1 VMware Network Adapter VMnet1
    169.254.72.209 Conexión de área local* 1
    169.254.186.117 Ethernet
    192.168.1.35 Wi-Fi
    127.0.0.1 Loopback Pseudo-Interface 1

    Comentario


    • #3
      Originalmente publicado por noSign Ver Mensaje

      Funciona, pero falta un "1" en pw-ccif.txt según el segundo script.:
      "tu password gmail" | Convertto-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-file "c:\util\ps\pw-ccif1.txt"

      El script es para SMTP con SSL (puerto 587)
      Yo envio por SMTP con TLS (puerto 465) desde outlook

      Pero si cambio en el script
      $ClienteSMTP = New-Object Net.Mail.SmtpClient($ServidorSMTP, 465)
      $ClienteSMTP.EnableTls = $true



      Me incluye toda las interfaces de red, no solo la que envia.:

      ipps.txt.:
      192.168.220.1 VMware Network Adapter VMnet8
      169.254.41.240 Conexión de área local* 2
      192.168.127.1 VMware Network Adapter VMnet1
      169.254.72.209 Conexión de área local* 1
      169.254.186.117 Ethernet
      192.168.1.35 Wi-Fi
      127.0.0.1 Loopback Pseudo-Interface 1
      Siejpre envia todas las interfaces "INTERNAS" que tiene tu maquina... además es facil a la vista de eso que esatas unido por 192.168.1.35 Wi-Fi. Las 169.254.* es que son autoasignadas, es decir que no hay conectividad o no hay un DCHP que le de direccion, y las VMNet1 y VMNet8 son las de VMWare..

      ¿a que te ha gustado?... y se le puede sacar toda la utilidad que le de tu imaginacion...

      NOTA: he corregido lo del "1" .... échalo una mirada...

      Comentario


      • #4
        Perfecto, pero lo veo peligroso. ¿No queda constancia de los envios al no pasar por un smtp corporativo?

        Comentario


        • #5
          Originalmente publicado por noSign Ver Mensaje
          Perfecto, pero lo veo peligroso. ¿No queda constancia de los envios al no pasar por un smtp corporativo?
          No queda constancia... como la maquina sea capaz de salir al puerto destino...de esta forma sale...sin que nadie pueda controlarlo ni quede constancia...

          Y esto es un agujero de seguridad que seguramente existe en todas las empresas... y cualquier empleado malicioso podría sacar información confidencial por este camino... sin que quede reflejo de nada.

          Comentario

          Trabajando...
          X