Microsoft Lync Server
Header

Seguramente a muchos de vosotros os ha surgido la necesidad en algún momento, de evitar que los usuarios cierren sesión en Lync. Esto a menos que te crees (picando código) tú una interface del cliente Lync, no viene por defecto a nivel de diseño y ni de plantillas de ADMX ninguna opción para poder evitarlo. El script es muy muy sencillo, pero es que un servidor lo del desarrollo … así que para los que tengáis un buen nivel de scripting .. mil disculpas. Una vez comentado esto,  veamos qué es lo que he hecho para evitar que los usuarios cierren sesión en Lync de forma indefinida mientras están con en su sesión de Windows

Teniendo en cuenta que queremos evitar tener que programar nuestras propia interface de Lync, que no queremos complicarnos en exceso pero si queremos ofrecer una solución alternativa a nuestro cliente. Antes de dar con la "solución", la primera pregunta que se me venía a la cabeza era: ¿Cómo voy a ser capaz de detectar si el usuario está con la sesión iniciada en el puesto cliente? De esta pregunta empezaron a surgir posibles respuestas (no muchas la verdad):

– ¿Consultar la tabla de estados en el SQL Server?

– ¿Utilizar un software de terceros para verificar el estado?

jeje, ya veis que poca cosa se me ha ocurrido así a bote pronto. Pero luego he pensado que lo que sí podía comprobar era si tenía una conexión establecida con el servidor vía el puerto 5061 (SIP)!! De ahí que lo primero que me he puesto a probar era a ejecutar el NETSTAT y filtrar las conexiones de tal forma que pudiera detectar si hay una conexión establecida o no a través del puerto 5061 hacia el servidor o pool (esto a nosotros nos daría igual). He lanzado el siguiente comando: NETSTAT-AN | FIND /RC:"5061 .*ESTABLISHED"

No_Cerrar_Lync_3.png

Lo que consigo es que me muestre solo las conexiones con la cadena de texto que contenga: 5061 .*ESTABLISHED. De tal forma puedo ver que obtengo como resultado un listado de las conexiones al puerto 5061 y establecida. Aquí cada uno que ajuste lo que considere, si queréis además buscar por una cadena de texto que os permite definir la IP de Destino, etc.. también podéis hacerlo. Ahora que ya tenía la primera parte conseguida, tengo que crear un CMD que me permite ejecutarlo cada cierto tiempo (30 segundos por ejemplo) para que compruebe si existen conexiones establecidas al puerto 5061. Porqué establecidas, porque es el estado que tiene una conexión que está activa, de tal forma que no estará constantemente tratando de ejecutar ciertos procesos si está en otros estados. El script se volverá a ejecutar cada 30 segundos (timeout 30), pero cada uno que lo ajuste a lo que considere oportuno. Una vez pasados los 30 segundos comprobarán si existe alguna conexión establecida, si el resultados es positivo (if errorlevel 0 goto Inicio) volverá al inicio del script (:inicio) y a esperar otros 30 segundos antes de volver a iniciar el de nuevo el proceso. En el caso de que no existan conexiones establecidas (if errorlevel 1 goto IncioLync) el script ejecutará una serie de tareas:

  1. Cerrar el proceso de Lync: Tenemos que cerrarlo puesto que no podemos pulsar el botón de Iniciar Sesión desde aquí (si con otra herramienta a mayores, pero no he querido inicialmente complicarme más)
  2. Volver a iniciar el cliente Lync (en función de la versión del cliente de Lync buscará una ruta u otra, serían scripts diferentes pero se puede hacer en uno solo y que antes compruebe que versión de Lync se tiene instalada)
  3. El script vuelve al inicio para esperar otros 30 segundos antes de volver a comprobar el estado de la conexión

Script Cliente Lync 2010

:Inicio
 timeout 30
 @echo on
netstat -an | findstr /RC:"5061 .*ESTABLISHED"
if errorlevel 1 goto IncioLync
if errorlevel 0 goto Inicio
:IncioLync
 taskkill /IM communicator.exe /F
 cd "C:\Program Files (x86)\Microsoft Lync"
 Start Communicator.exe"
goto Inicio
 
Script Cliente Lync 2013
 

:Inicio
 timeout 30
 @echo on
netstat -an | findstr /RC:"5061 .*ESTABLISHED"
if errorlevel 1 goto IncioLync
if errorlevel 0 goto Inicio
:IncioLync
 taskkill /IM communicator.exe /F
 cd "C:\Program Files\Microsoft Office\Office15"
 Start Lync.exe"
goto Inicio

 
Lo que debéis hacer es copiar el texto de color azul y pegarlo en un fichero de texto, guardarlo con la extensión CMD y ya lo tenéis listo para probar. Y ahora solo quedar probarlo, y esperar que funcione como esperamos. Lo que tiene que ocurrir es que si el usuario ha cerrado la aplicación del cliente Lync o ha cerrado la sesión, el script cerrará la aplicación y la volverá a iniciar de forma inmediata. Como el usuario ha guardado la contraseña en algún momento (imprescindible), la sesión se inicia directamente. Al inicio del artículo os dejo un vídeo del funcionamiento del script.
En el vídeo habéis visto que he ejecutado manualmente el script, lo suyo es crear una GPO y colocarlo como script de inicio de sesión del usuario. Esto como veis es muy básico y tiene sus contras:
  • Tenemos que iniciar sesión en Lync una primera vez para guardar la contraseña
  • Si el usuario descubre el script en el administrador de tareas y lo finaliza ya no servirá para nada más
  • Si el usuario no guarda la contraseña, el script intentará constantemente cerrar y abrir el cliente Lync cada 30 segundos pero no hará más que molestar al usuario
  • No es posible parametrizarlo para que lo podamos parar cuando queramos y que posteriormente siga funcionando en una sesión iniciada

Como veis es muy rudimentario, pero estoy seguro que alguna pista habré dado para que alguien con buenas dotes de programador se le ocurra la forma de hacer algo mejor. Por favor, os pediría que si encontráis una solución mejor que esta (seguro que sí) dejéis algún comentario para poder hacer algo más profesional.

De todas formas le daré una vuelta para hacerlo algo similar con PowerShell y evitar que el usuario pueda interactuar con el, evitando que lo pueda cerrar, etc… como os comento es muy rudimentario y espero que algún developer o persona con buen manejo de PowerShell me ayude.

Espero que os sea de utilidad!!!