none
Remote App Manager Permitir una sola conexion por usuario RRS feed

  • Pregunta

  • Buenos tardes

    Tengo la siguiente inquietud tengo una aplicacion corriendo en Remote App Manager, de la cual creo un ,rdp e instalo a los usuarios externos.

    En la configuracion de Remote Desktop Services esta habilitada la opcion "Restrict each user to a single sesion". A pesar de esta configuracion los usuarios pueden aperturar la aplicacion tantas veces deseen con el mismo usuario.

    Lo que se desea es que el usuario este limitado a poder aperturar una conexion de Remote App Manager (RDS) a una sola. Esto si aplica cuando se realizan las pruebas de Remote Desktop Services (Conexion Remota a travez de mstsc) al aperutar este tipo de conexion la sesion anterior se "tumba".

    Saludos


    • Editado VR1387 martes, 27 de noviembre de 2012 22:03 error
    martes, 27 de noviembre de 2012 19:45

Respuestas

  • Hola Vvan Gogh!

    Es importante setearte expectativas: mediante la funcionalidad RemoteApp de Windows Server no vas a poder limitar la ejecución de un proceso a una vez por usuario, salvo que la aplicación por si misma lo permita (entiendo no es tu caso).

    Ahora bien, tal como comenta Tomás Hidalgo, tenés la posibilidad de utilizar programación .Net (con Visual Studio) u otro lenguaje de programación para realizar alguna aplicación que sea "lanzadora" de otra (como se propone en el foro en Inglés cuyo link te pasó Tomás). Estas aplicaciones chequean si ya tenés ese proceso corriendo en el sistema para dicho usuario, y si no existe lo lanza, sino lo anula y evita que se abra dos veces.

    Te adjunto en este post un link, a modo de ejemplo, de un aplicativo que realicé yo hace unos meses. En su momento lo utilicé para brindar una remediación a un problema similar al tuyo: tenía que lanzar un proceso específico (aplicación) una sola vez, y si el usuario quería volver a ejecutarlo lo tenía que frenar de alguna forma (el problema original era que si el aplicativo se lanzaba dos veces, generaba un error!).

    El código fuente .Net de dicho aplicativo, y las instrucciones completas, las subí a la Galería de Technethttp://gallery.technet.microsoft.com/Limitar-a-una-instancia-474c8b1a

    También te dejo aquí el código fuente pegado del proyecto de consola en C#:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Diagnostics;
    using System.Configuration;
    
    namespace SingleAppLaunch.App
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                Process[] ProcessList = Process.GetProcesses();
                Process CurrentProcess = Process.GetCurrentProcess();
                int Contador = 0;
    
                foreach (Process p in ProcessList)
                {
                    if ((p.SessionId == CurrentProcess.SessionId) && (p.ProcessName == ConfigurationSettings.AppSettings["Proceso"]))
                    {
                        Contador++;
                    }
                }
    
                if (Contador > 0)
                {
                    Console.WriteLine("El proceso \"{0}\" solo puede ser abierto una vez", ConfigurationSettings.AppSettings["Proceso"]);
                    Console.ReadLine();
                }
                else
                {
                    System.Diagnostics.Process.Start(ConfigurationSettings.AppSettings["Path"] + ConfigurationSettings.AppSettings["Proceso"] + ConfigurationSettings.AppSettings["Extension"]);
                }
    
            }
        }
    }

    El app.config que acompaña al software es el siguiente:

    <?xml version="1.0"?>
    <configuration>
      <appSettings>
        <add key="Path" value="c:\windows\system32\"/>
        <add key="Proceso" value="calc"/>
        <add key="Extension" value=".exe"/>
      </appSettings>
      
        <startup> 
            
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
    </configuration>

    En el ejemplo subido te lo dejé configurado con la calculadora de Windows (calc.exe). Si el usuario ya abrió una instancia de la calculadora, aparece un mensaje en un CMD diciendo que no lo puede abrir.

    Ahora bien, vuelvo a setearte expectativas (insisto con esto para que no te crees falsas expectativas de solución mágica):

    • Es una remediación: si el usuario llega a poder ejecutar otro .exe por fuera de la publicación, podrá lanzar la aplicación más de una vez.
    • No es un entorno seguro: para seguridad deberías ir a una solución de otro fabricante. Aquí solo existe un aplicativo que chequea si el proceso está o no abierto, nada más.
    • No publicás el aplicativo real (por ejemplo la calculadora de Windows), sino que publicás el .exe del código que te paso que lanza la calculadora si no está abierta. Lo mismo pasa con el post en Inglés que te propone Tomás.
    • Si querés una solución real que no tenga las limitaciones de los puntos arriba descritos deberías ir a una solución como Citrix que da un entorno seguro e integrado para hacer estas cosas.

    Espero haber sido claro! Expresivo! y que la respuesta te haya servido!!!!! Y que el código que te adjunto te sirva :-) podés modificarlo a tu gusto.

    Saludos!!!


    Pablo Ariel Di Loreto
    IT Consultant

    This posting is provided "AS IS" with no warranties and confers no rights! Always test ANY suggestion in a test environment before implementing!


    viernes, 30 de noviembre de 2012 7:05

Todas las respuestas

  • Hola Vvan Gogh!

    Una cosa es la cantidad de sesiones que pueden abrir, y otra son las aplicaciones que se abran a través de RemoteApp. Si mal no entendí, la situación que estás teniendo es la siguiente:

    1. Tenés la restricción de "Restrict each user to a single sesion".
    2. Hacés un RemoteApp por ejemplo de "calc.exe".
    3. El usuario puede abrir muchas aplicaciones "calc.exe", y lo que querés es que solo se instancie 1 vez el aplicativo calc.exe para ese usuario.

    Si esto que te digo es correcto, no vas a poder hacerlo a través de las configuraciones de RemoteApp Manager. El motivo es simple: la restricción de una sesión por usuario se aplica a las sesiones de escritorio remoto (perfil) pero no a las aplicaciones que podés ejecutar desde RemoteApp Manager. Si esto no fuera así, haría que si tenés publicadas 5 aplicaciones (Word, Excel, PowerPoint, etc) el usuario solo pueda abrir una aplicación, pero cuando abre la segunda se le cerraría la primera. Esto por diseño de RemoteApp Services no funciona así.

    Lo podés comprobar fácilmente: si una vez iniciada una aplicación RemoteApp desde un equipo el usuario va a otro equipo y abre nuevamente uno de sus iconos RemoteApp, vas a ver que en la otra PC la sesión se cierra (se desconecta) y desde la nueva PC se "roba" la sesión remota con todas las aplicaciones abiertas. Esto es, justamente, porque está habilitada la restricción de una sesión por usuario.

    Si la descripción del problema que querés solucionar no es exactamente lo que planteabas, dame feedback!

    Saludos!!


    Pablo Ariel Di Loreto
    IT Consultant

    This posting is provided "AS IS" with no warranties and confers no rights! Always test ANY suggestion in a test environment before implementing!

    miércoles, 28 de noviembre de 2012 6:32
  • Hola Vvan Gogh!

    Una cosa es la cantidad de sesiones que pueden abrir, y otra son las aplicaciones que se abran a través de RemoteApp. Si mal no entendí, la situación que estás teniendo es la siguiente:

    1. Tenés la restricción de "Restrict each user to a single sesion".
    2. Hacés un RemoteApp por ejemplo de "calc.exe".
    3. El usuario puede abrir muchas aplicaciones "calc.exe", y lo que querés es que solo se instancie 1 vez el aplicativo calc.exe para ese usuario. *1

    Si esto que te digo es correcto, no vas a poder hacerlo a través de las configuraciones de RemoteApp Manager. El motivo es simple: la restricción de una sesión por usuario se aplica a las sesiones de escritorio remoto (perfil) pero no a las aplicaciones que podés ejecutar desde RemoteApp Manager. Si esto no fuera así, haría que si tenés publicadas 5 aplicaciones (Word, Excel, PowerPoint, etc) el usuario solo pueda abrir una aplicación, pero cuando abre la segunda se le cerraría la primera. Esto por diseño de RemoteApp Services no funciona así.

    Lo podés comprobar fácilmente: si una vez iniciada una aplicación RemoteApp desde un equipo el usuario va a otro equipo y abre nuevamente uno de sus iconos RemoteApp, vas a ver que en la otra PC la sesión se cierra (se desconecta) y desde la nueva PC se "roba" la sesión remota con todas las aplicaciones abiertas. Esto es, justamente, porque está habilitada la restricción de una sesión por usuario. *2

    Si la descripción del problema que querés solucionar no es exactamente lo que planteabas, dame feedback!

    Saludos!!


    Pablo Ariel Di Loreto
    IT Consultant

    This posting is provided "AS IS" with no warranties and confers no rights! Always test ANY suggestion in a test environment before implementing!

    Buenas dias

    Gracias por la respuesta.

    *1- Efectivamente es lo que deseo, que el usuario solo pueda abrir una instancia del aplicativo por usuario. No permitir que el usuario aperture tantas veces la aplicacion desde una misma maquina. (Esto solo por aplicativo).

    *2-Ojo Remote App es una cosa, segun la informacion que me proporcionas esta no actua asi, el tema de la sesion "robada" es solo aplicable cuando el usuario conecta por Remote Desktop Services (mstsc), no por el icono de la aplicacion (Remote App), correcto?.

    En resumen y siguiendo el plateamiento, permitir la aperturar del aplicativo 1 una vez por usuario y/o aplicativo, no tantas veces el usuario lo desee. (Ejecutando la aplicacion desde la misma PC) este es el comportamiento que se busca.

    Saludos

    Saludos

    miércoles, 28 de noviembre de 2012 14:35
  • Hola Vvan Gogh!

    Te respondo:

    *2 - La sesión "robada" funciona tanto para mstsc como para RemoteApp. Si restringís que los usuarios puedan iniciar una sola sesión de Remote Desktop, y teniendo en el equipo A un aplicativo RemoteApp abierto, cuando iniciás desde otro equipo ese u otro aplicativo, la sesión completa se "roba" (y aparecerá en el equipo B el nuevo aplicativo abierto + los que ya tenías en el otro "equipo"). ¿Se entiende?

    Esto sucede, justamente, porque una cosa es la sesión (limitada a una) y otra son instancias de aplicaciones (procesos).

    En conclusión, para restringir abrir una sola vez la aplicación deberías pensar en una solución que se complemente con RemoteApp o le sume funcionalidad. Citrix tiene algunas funcionalidades que permiten realizar esto.

    Esperamos tu feedback!!

    Saludos!!


    Pablo Ariel Di Loreto
    IT Consultant

    This posting is provided "AS IS" with no warranties and confers no rights! Always test ANY suggestion in a test environment before implementing!

    miércoles, 28 de noviembre de 2012 15:18
  • Buenas tardes

    Pablo entiendo perfectamente el punto y agradecido por tu feedback.

    Lo que entendi y lo que he visto en produccion. entiendo que si un aplicativo es aperturado desde un equipoA con un usuario1, y la misma aplicacion es abierta desde un equipoB con el mismo usuario1, la aplicacion sera cerrada en el equipoA y abierta en el equipoB, entiendo este punto. Y eso se aplica cuando son distintos equipos y se ha comprobado, hasta aqui estamos perfecto.

    Pero cuando ejecuto la aplicacion desde el mismo equipoA, con el mismo usuario1, y abro la aplicacion varias veces (desde el mismo equipoA), no se "roba" la sesion abierta. Esto se ha comprobado varias veces.

    Para finalizar: Para poder restringir la apertura de la aplicacion (a una) varias veces en el mismo equipo, y con el mismo usuario, definitivamente debo ir a una solucion con Citrix?

    Saludos

    PD: Disculpa la inistencia es corroborar lo dicho pero es un tema de una aplicacion ya esta en produccion y temas de conexions de bases de datos y uso de licencias del aplicativo.

    miércoles, 28 de noviembre de 2012 17:58
  • Hola,

    En los foros TechNet de TS en ingles trataron este tema.

    Vvan Gogh, revisa la solución que se ofrece en este hilo por si aplica a tu entorno.

    How to realize only one identical remoteApp per session per user per computer?
    http://social.technet.microsoft.com/Forums/en-US/winserverTS/thread/bc0cefe5-82a5-4e70-8e02-39755b527cac


    Un saludo,

    Tomas Hidalgo

    Colobora con el foro: Si la respuesta es de utilidad para resolver tu duda/problema, usa la opción "Marcar como repuesta". Otros usuarios con dudas similares -en un futuro- lo agradecerán.

    jueves, 29 de noviembre de 2012 19:38
    Moderador
  • Hola Vvan Gogh!

    Es importante setearte expectativas: mediante la funcionalidad RemoteApp de Windows Server no vas a poder limitar la ejecución de un proceso a una vez por usuario, salvo que la aplicación por si misma lo permita (entiendo no es tu caso).

    Ahora bien, tal como comenta Tomás Hidalgo, tenés la posibilidad de utilizar programación .Net (con Visual Studio) u otro lenguaje de programación para realizar alguna aplicación que sea "lanzadora" de otra (como se propone en el foro en Inglés cuyo link te pasó Tomás). Estas aplicaciones chequean si ya tenés ese proceso corriendo en el sistema para dicho usuario, y si no existe lo lanza, sino lo anula y evita que se abra dos veces.

    Te adjunto en este post un link, a modo de ejemplo, de un aplicativo que realicé yo hace unos meses. En su momento lo utilicé para brindar una remediación a un problema similar al tuyo: tenía que lanzar un proceso específico (aplicación) una sola vez, y si el usuario quería volver a ejecutarlo lo tenía que frenar de alguna forma (el problema original era que si el aplicativo se lanzaba dos veces, generaba un error!).

    El código fuente .Net de dicho aplicativo, y las instrucciones completas, las subí a la Galería de Technethttp://gallery.technet.microsoft.com/Limitar-a-una-instancia-474c8b1a

    También te dejo aquí el código fuente pegado del proyecto de consola en C#:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Diagnostics;
    using System.Configuration;
    
    namespace SingleAppLaunch.App
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                Process[] ProcessList = Process.GetProcesses();
                Process CurrentProcess = Process.GetCurrentProcess();
                int Contador = 0;
    
                foreach (Process p in ProcessList)
                {
                    if ((p.SessionId == CurrentProcess.SessionId) && (p.ProcessName == ConfigurationSettings.AppSettings["Proceso"]))
                    {
                        Contador++;
                    }
                }
    
                if (Contador > 0)
                {
                    Console.WriteLine("El proceso \"{0}\" solo puede ser abierto una vez", ConfigurationSettings.AppSettings["Proceso"]);
                    Console.ReadLine();
                }
                else
                {
                    System.Diagnostics.Process.Start(ConfigurationSettings.AppSettings["Path"] + ConfigurationSettings.AppSettings["Proceso"] + ConfigurationSettings.AppSettings["Extension"]);
                }
    
            }
        }
    }

    El app.config que acompaña al software es el siguiente:

    <?xml version="1.0"?>
    <configuration>
      <appSettings>
        <add key="Path" value="c:\windows\system32\"/>
        <add key="Proceso" value="calc"/>
        <add key="Extension" value=".exe"/>
      </appSettings>
      
        <startup> 
            
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
    </configuration>

    En el ejemplo subido te lo dejé configurado con la calculadora de Windows (calc.exe). Si el usuario ya abrió una instancia de la calculadora, aparece un mensaje en un CMD diciendo que no lo puede abrir.

    Ahora bien, vuelvo a setearte expectativas (insisto con esto para que no te crees falsas expectativas de solución mágica):

    • Es una remediación: si el usuario llega a poder ejecutar otro .exe por fuera de la publicación, podrá lanzar la aplicación más de una vez.
    • No es un entorno seguro: para seguridad deberías ir a una solución de otro fabricante. Aquí solo existe un aplicativo que chequea si el proceso está o no abierto, nada más.
    • No publicás el aplicativo real (por ejemplo la calculadora de Windows), sino que publicás el .exe del código que te paso que lanza la calculadora si no está abierta. Lo mismo pasa con el post en Inglés que te propone Tomás.
    • Si querés una solución real que no tenga las limitaciones de los puntos arriba descritos deberías ir a una solución como Citrix que da un entorno seguro e integrado para hacer estas cosas.

    Espero haber sido claro! Expresivo! y que la respuesta te haya servido!!!!! Y que el código que te adjunto te sirva :-) podés modificarlo a tu gusto.

    Saludos!!!


    Pablo Ariel Di Loreto
    IT Consultant

    This posting is provided "AS IS" with no warranties and confers no rights! Always test ANY suggestion in a test environment before implementing!


    viernes, 30 de noviembre de 2012 7:05
  • Hola Vvan Gogh,

    ¿Pudiste resolver o encontrar una solución a tu problemática con los datos que te hemos dado?

    Saludos!


    Pablo Ariel Di Loreto
    IT Consultant

    This posting is provided "AS IS" with no warranties and confers no rights! Always test ANY suggestion in a test environment before implementing!

    martes, 11 de diciembre de 2012 1:53
  • Buenas

    No he podido probar las sugerencias que me dan, doy la pregunta por respondida.

    En lo que tenga algun avance, les aviso.

    Saludos

    martes, 18 de diciembre de 2012 16:21
  • Hola Vvan Gogh,

    ¿Pudiste resolver o encontrar una solución a tu problemática con los datos que te hemos dado?

    Saludos!


    Pablo Ariel Di Loreto
    IT Consultant

    This posting is provided "AS IS" with no warranties and confers no rights! Always test ANY suggestion in a test environment before implementing!

    Hola Pablo, estaba feliz de haber econtrado esta solucion pero la dicha me duro poco, pues tira un error y no se porque, lo tengo instalado en un servidor windows 2008 standar.

    alguna idea para corregirlo?

    muchas gracias por tu ayuda

    Descripción:
      Stopped working
    Firma con problemas:
      Nombre del evento de problema: CLR20r3
      Firma del problema 01: singleapplaunch.app.exe
      Firma del problema 02: 1.0.0.0
      Firma del problema 03: 50b84fed
      Firma del problema 04: System
      Firma del problema 05: 4.0.0.0
      Firma del problema 06: 4ea7ab8b
      Firma del problema 07: 3e43
      Firma del problema 08: 2a9
      Firma del problema 09: System.ComponentModel.Win32
      Versión del sistema operativo: 6.0.6002.2.2.0.16.7
      Id. de configuración regional: 9226

    domingo, 9 de junio de 2013 7:58
  • Hola Pablo, disculpame... el error lo tenia yo... trabaja de lujo, fue que habia puesto mal el nombre del ejecutable en archivo config

    muchas gracias por tu aporte!!!

    Eres un genio!! :)

    JuanE

    domingo, 9 de junio de 2013 8:05
  • Hola Juanesalda!

    Buenísimo que te ha funcionado! Estamos en contacto!

    Saludos!!


    Pablo Ariel Di Loreto
    IT Consultant

    This posting is provided "AS IS" with no warranties and confers no rights! Always test ANY suggestion in a test environment before implementing!

    miércoles, 12 de junio de 2013 23:34