Denegar inicio de sesión en un Terminal Server en función de la IP de origen

Un usuario me planteó en los foros de Server cómo evitar con un script que un usuario inicie sesión en TS desde determinada subred, y permitírselo sólo desde otra.

Para ello, el problema está en averiguar desde dentro de la sesión remota la dirección IP del equipo cliente desde el que se ha lanzado la sesión TS. Para hacerlo nos vamos a apoyar en la utilidad gratuita ENVTSCIP, que se puede descargar desde el siguiente enlace:

 
http://www.ctrl-alt-del.com.au/CAD_Utils.htm#Freeware

De todas estas utilidades, usaremos ENVTSCIP.EXE, ejecutable que habrá que poner en el servidor, en una ruta que esté en el path de todos los usuarios, como puede ser windows\system32. El archivo bat en que copiaremos el script lo asignaremos como script de inicio de sesión para los usuarios que se conectarán de forma remota por TS y cuyo origen queramos controlar, lo que podemos hacer mediante GPO, en su perfil, o en el menú de inicio de todos los usuarios. En función del número de usuarios a los que queramos aplicar esto y del número de servidores TS en los que puedan acceder nos será más cómoda una cosa que otra.

Previamente necesitaremos saber cual es el rango de IP,s de las subredes desde las que puede acceder el usuario, pues en función de ello variará la línea nº 6, “set remotenet=%remoteip:~,9%”. En este ejemplo he asumido que las direcciones IP a tratar son del tipo 192.168.1.x, clase C, por lo que la subred la definen las tres primeras cifras decimales, que en el ejemplo, incluyendo los puntos, suponen 9 caracteres. Si fuera 10.162.x.x, entonces el número de caracteres para esa subred sería 6, y así. Si queremos complicar el tema con subredes de distinto tamaño, o con máscaras que no sean múltiplos de 8 bit, todo consiste en variar un poquito el script para adaptarlo.

Una vez asignado el script, si el usuario inicia sesión TS desde un PC en la red correcta, la sesión iniciará sin problemas, pero si lo hace desde la que no queremos, la sesión se cerrará automáticamente.

Rem Inicio del Script que se ejecutará en el servidor TS. En la segunda línea de código cambiar NOMBRESERVIDORTS por el nombre real.
echo off
if not %computername% EQU NOMBRESERVIDORTS goto fin
for /f "tokens=1,2* delims=:" %%i in (‘ envtscip ^| find "WTS" ‘) do set remoteip=%%j
set remoteip=%remoteip:~1%
set remotenet=%remoteip:~,9%

if %username% EQU Pedro goto usuariored1
if %username% EQU Juan goto usuariored1
if %username% EQU Manolo goto usuariored2
if %username% EQU Paco goto usuariored2
goto fin

:usuariored1
if %remotenet% EQU 192.168.2 goto cerrarsesion
goto fin

:usuariored2
if %remotenet% EQU 192.168.1 goto cerrarsesion
goto fin

:cerrarsesion
shutdown /l

:fin
Rem Fin del Script