Cómo evitar que un usuario inicie sesión en el dominio más de una vez

Esta es una vieja pregunta, que reaparece de vez en cuando. Esta vez, viene por correo de parte de Daniel

Se pretende que uno, un grupo, o todos los usuarios de un dominio no puedan iniciar sesión en él más que una vez de manera concurrente, es decir, desde varios equipos a la vez.

Implementar esto tanto en el lado del servidor como en el del cliente puede parecer sobre el papel una cosa sencilla. Un atributo asociado al objeto del usuario que llevara la cuenta de los inicios y cierres de sesión del usuario y una política que lo leyera y que especificara un cierto umbral. Sin embargo esto sería complicado hacerlo funcionar de manera correcta en un entorno mediano o grande, porque nos encontraríamos con algo similar al clásico problema de la sincronización de cambios de contraseñas, GPOs, etc. entre los diferentes controladores de dominio (os recomiendo leer los apartados "Urgent Replication" y "Replication of password changes" del artículo "How the Active Directory Replication Model Works"). Un usuario podría iniciar sesión desde dos sitios distintos si es autenticado por dos DCs diferentes que todavía no hubieran replicado la información almacenada en ese hipotético atributo. Por tanto, hay que hacer algo para centralizar esa información, cosa que va un poco en contra de la filosofía de entorno distribuido de Directorio Activo.

Estas soluciones pueden funcionar bien, sobre todo en entornos con pocos DCs

1.- Usar una carpeta de red compartida y un login script. La idea es crearle a cada usuario una carpeta compartida, limitada a una única conexión concurrente, y hacer un "net use" a ella en el login script. Si el usuario inicia sesión una segunda vez, el comando fallará, se captura el error, y se fuerza un logoff. Todo esto se detalla aquí:

How to Use a Network Share to Limit a User's Concurrent Connections in Windows 2000

2.- Utilizar la herramienta Cconnect.exe del Kit de Recursos de Windows 2000. Sustituye al script en el lado cliente y en lugar de la carpeta compartida de red se utiliza una base de datos SQL. Es menos cutre que lo anterior, pero más complicado y un pelín obsoleto.

Limiting a user's concurrent connections in Windows Server 2003, Windows 2000, and Windows NT 4.0

3.- Puestos a ensuciarse las manos, la mejor solución es usar LimitLogin.exe, que utiliza scripts de inicio y cierre de sesión en VBS, un servicio Web que se encarga de recibir la información y de leerla y almacenarla en una partición de datos del Directorio Activo. Esta es la arquitectura, sacada del artículo "Utility Spotlight Limit Login Attempts With LimitLogin" publicado en la TechNet Magazine

 

Si a alguien se le ocurre alguna otra cosa, cualquier idea es bienvenida

Saludos

David Cervigón