sábado, 5 de enero de 2013

Activar mensajero en Windows 7 y 2008

Saludos,

El mensajero es un servicio que permite enviar mensajes entre dos equipos con sistema operativo windows, para usarlo primero se debe activar tanto en el equipo origen como en el equipo destino y luego se utiliza digitando en el prompt o en inicio - ejecutar el comando: net send [equipo de destino] [mensaje a enviar] , ó en vez de equipo de destino se puede reemplazar por "*" si es a toda la red - los mensajes aparecerán en los equipos de destino como una ventana  pop up, veremos la manera de emular su funcionamiento en windows 7 y 2008 donde fué eliminado dicho servicio.




                                                         
                                                        

Éste se activa en Windows XP y 2003 en el menú panel de control - herramientas administrativas - servicios, allí se busca el mensajero, se le da click derecho - propiedades y luego de la lista desplegable de tipo de inicio se le pone inicio automático, luego click al botón iniciar y listo, ejecutando el procedimiento en dos equipos ya se puede enviar mensajes entre ellos.


                                 

Por razones de seguridad éste servicio ya no viene disponible en windows 7, a continuación miraremos la forma de emular el funcionamiento de éste servicio en windows 7 mediante un workaround.

El siguiente procedimiento se ideó pensando en una red mixta donde hay computadores con sistema operativo windows 2003, 2008, XP y 7 en donde al enviar un mensaje via net send a todos los equipos de la red lo reciben los equipos que tienen sistema operativo XP y 2003 pero el mismo mensaje no les llega a  los equipos que tienen sistema operativo windows 2008 y 7.

Inicialmente lo que necesitamos es capturar el mensaje que haya llegado a alguno de los equipos que tiene la capacidad de recibirlo y de alguna manera hacer que se muestre en la pantalla de los equipos que no pueden recibirlo, teniendo ésto claro, empezamos a crear una solución para éste problema.

Para capturar el contenido del mensaje podemos hacerlo una vez que el equipo lo haya recibido extrayéndolo del visor de eventos de windows del equipo donde llegó ya que éste queda registrado allí.en el visor de eventos de system como tipo application pop up y con el ID 26 , inicialmente haremos uso de una tarea programada tipo evventriggers que viene incluida en windows XP y 2003 que tiene parámetros configurables y lo que hace es estar pendiente de algún tipo de evento que se registre en el visor de eventos y si se registra dicho evento que se configuró, se dispara una tarea programada preconfigurada.

Para hacer la prueba envien un mensaje desde un equipo XP a otro XP digitando en el promt de CMD
net send 192.168.0.16 Prueba de envio net send y presionan enter, ahjora vamos a revisar el visor de sucesos del equipo destino, para ello le damos click derecho a mi PC - administrar - click a visor de sucesos - click al log system y click al último evento tipo 26 que se registre, les debe aparecer algo así:

                                          
                                       
Uno de los objetivos será hacer un script en powershell que haga lo que acabamos de hacer, que vaya al visor de eventos, encuentre el último suceso con ID 26 de tipo información del log system de windows, que extraiga el texto que se recibió del mensaje en una variable y lo envié a los otros equipos que no tienen el servicio de mensajero y cree un proceso remoto en dichos equipos para que usen su menjsaero local enviándose el mensaje a si mismos con el contenido de la variable de texto extraída del mensaje del visor de sucesos, suena complicado pero lo haremos paso a paso.

Ahora haremos una prueba del mensajero local en windows 7, no funciona el comando net send para recibir mensajes remotos pero si recibe mensajes de si mismo mediante el comando msg * "mensaje"
digitemos en el prompt de uno de los equipos windows 7 de la red lo siguiente: msg * mensaje de prueba local         

Les debe aparecer el mensaje en pantalla.

Ahora sabiendo como funciona, vamos a automatizar todo mediante scripts.                                                       

Entonces lo que haremos es ejecutar el siguiente comando en el prompt de uno de los equipos que puede recibir net send, preferiblemente en un servidor que siempre esté encendido:

eventtriggers /create /tr echo_Net_Send /l SYSTEM /eid 26 /t "information" /d echo_net_send /tk "D:\Scripts\Net_Send_Windows_7\Disparador_Net_Send_Echo_Windows_7.bat"

Si sale error por que no existe el bat en la ruta, creen uno en blanco con dicho nombre que luego le podremos las instrucciones necesarias.

El comando anterior lo que ésta haciendo es usar "eventtriggers" con los parámetros:

El parámetro /tr "nombre del disparador del evento" que para el caso se llamó "echo_Net_Send" Se le puede dar el nombre que se quiera que sea mnemotécnico para recordar que hace dicho disparador.

El parámetro /l "nombre del log a monitorear" que para el caso es "SYSTEM" lo que está implicando es que se monitoreará el log system del equipo, ya que hay varios logs entre ellos aplicación, seguridad, y algún otro dependiendo de la configuración específica del equipo, el que nos interesa es el log system ya que allí es donde queda registrado cuando se envía un "net send"

El parámetro /eid "número del identificador del evento" que para el caso es "26" que es propio de "application pop up" que son mensajes que muestra el sistema como cuando falla una aplicación pero en éste caso es el mensaje que se recibió de otro equipo.

El parámetro  /t "tipo de información del log" que para el caso es "information" otras opciones para usar aquí son  ERROR | INFORMATION | WARNING | SUCCESSAUDIT | FAILUREAUDIT , para el caso el mensaje net send recibido siempre será tipo information por lo tanto ese es el tipo que nos interesa.

El parámetro /d "descripción del disparador de evento" en éste caso le puse lo mismo que en el nombre "echo_net_send" se puede poner cualquier otra cadena de texto.

Por último el parámetro /tk "programa o script a ejecutar cuando se dispare el evento"
"D:\Scripts\Net_Send_Windows_7\Disparador_Net_Send_Echo_Windows_7.bat" en éste caso al llegar un mensaje de otro equipo quedará registrado en el visor de eventos y al hacerlo, se disparará el bat específicado, el contenido del bat es el siguiente:

powershell.exe "D:\Scripts\Net_Send_Windows_7\Net_Send_Echo_Windows_7.ps1" >> D:\Scripts\Net_Send_Windows_7\log_Eco_Net_send.log
Lo que hace el bat anterior es ejecutar un script previamente programado en powershell y guarda todo el output del script en un archivo para posterior debugging si es necesario.

El script en powershell lo que hace ahora sí es lo mencionado anteriormente, va y lee el log y extrae el contenido del texto del último evento tipo 26 del log de system de tipo application pop up que registró windows , veamos el contenido del script , le he comentado las líneas para que vean que hace cada una. Codigo Script powershell

Eso es todo, ahora cualquier net send que se envié a todos los equipos de la red será reenviado por el equipo donde se configuró el eventtriggers a todos los equipos windows 7 y windows 2008 que se tienen listados en el archivo "Ips_Windows_7.txt" que se invoca desde el script en powershell.

Mediante el procedimiento completo se le dió solución al problema que se tenía usando herramientas que vienen disponibles por defecto en windows o en sus actualizaciones sin necesidad de usar software externo, lo bueno es que como es programación orientada a objetos es modular y se le puede dar muchos otros usos al mismo código modificándole líneas, si tienen alguina duda sobre el funcionamiento o su implementación me pueden escribir.

2 comentarios:

  1. Hola amigo mi nombre es Gustavo y genere tu programa pero me salió un error en el log, te lo escribo a continuación:

    Se esta enviando el mensaje al equipo 132.1.19.90
    No se puede convertir el valor "\\132.1.19.90\ROOT\CIMV2:Win32_Process" al tipo
    "System.Management.ManagementClass". Error: "Acceso denegado. (Exception from
    HRESULT: 0x80070005 (E_ACCESSDENIED))"
    En C:\Scripts\Net_Send_Windows_7\Net_Send_Echo_Windows_7.ps1: 34 Carácter: 16
    + ([WmiClass] <<<< "\\$computador\ROOT\CIMV2:Win32_Process").Create($Comand
    oAEjecutar) # Se crea el proceso #remoto en la maquina, aqui es donde se ve la
    emulación no se usa net send que está desactivado si no que
    + CategoryInfo : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

    Se esta enviando el mensaje al equipo 132.1.22.210
    No se puede convertir el valor "\\132.1.22.210\ROOT\CIMV2:Win32_Process" al tip
    o "System.Management.ManagementClass". Error: "Acceso denegado. (Exception from
    HRESULT: 0x80070005 (E_ACCESSDENIED))"
    En C:\Scripts\Net_Send_Windows_7\Net_Send_Echo_Windows_7.ps1: 34 Carácter: 16
    + ([WmiClass] <<<< "\\$computador\ROOT\CIMV2:Win32_Process").Create($Comand
    oAEjecutar) # Se crea el proceso #remoto en la maquina, aqui es donde se ve la
    emulación no se usa net send que está desactivado si no que
    + CategoryInfo : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

    Hora de finalizacion del Script 2013/03/14 09:05:43 a.m.

    *****************************************************************************************************************************
    -----------------------------------------------------------------------------------------------------------------------------
    Hora de inicio del Script 2013/03/14 09:10:21 a.m.
    2013/03/14 09:10:21 a.m.
    Se enviara el mensaje
    prueba


    Lo que me hace falta creo yo es poder darle antes de que ingresen las ips, el usuario y el password para que me deje entrar a cada ip, creo eso, no se como me puedas ayudar. mil gracias email tavodim gmail.com

    ResponderEliminar
  2. como pudo habilitar el servicio de mensajero de windows xp ,atraves de comandos (CMD) y luego iniciarlo de la misma manera.......

    ResponderEliminar