Windows: ¿Cómo hacer que los programas piensen que no se están ejecutando en una sesión de Terminal Server?

11

Estoy usando el programa "SoftXPand 2011 Duo" de Miniframe en mi PC con Windows 7. Hace dos estaciones de trabajo de una computadora. Utiliza los servicios de terminal integrados en Windows para crear la sesión adicional. Utilizo dos pantallas, dos teclados y dos ratones para crear esta "ilusión" de dos computadoras. Funciona bastante bien e incluso puedo jugar dos juegos 3D diferentes en las dos pantallas conectadas a esta sola máquina (usando una Radeon HD5770 y una Core i5 2500k con 8 Gbytes RAM).

Hay algunas desventajas en esto. Acabo de encontrar uno que está oculto en el primer vistazo. ¡Las sesiones en las que se encuentre (incluso en la primera estación de trabajo) se identificarán como una sesión de servidor terminal! Ahora algunos programas se ejecutarán con efectos limitados (gráficos), y algunos no se ejecutarán en absoluto.

Esto también provocó que algunos juegos no se ejecutaran en absoluto. Simplemente dicen "No se puede ejecutar en una sesión de servidor terminal" y salen. Ya he demostrado que los mejores juegos modernos (DirectX 10, 11) funcionan tan bien como en la misma máquina sin SoftXPand, ¡así que esta es una limitación bastante artificial!

Entonces, ¿puedo hackear de alguna manera mi sesión actual para que ya no se vea como una sesión de servidor terminal? ES DECIR

#include <windows.h>
#pragma comment(lib, "user32.lib")

BOOL IsRemoteSession(void)
{
   return GetSystemMetrics( SM_REMOTESESSION );
}

Volverá FALSO? (¡No es una pregunta de programación! ¡Solo un ejemplo de cómo los programas detectan si están en una sesión de servidor terminal!)

sinni800
fuente
¿Tienes dos teclados / pantallas? Elabore un poco más sobre su configuración.
harrymc
@harrymc Sí, lo hago. Edición.
sinni800
La razón por la que las aplicaciones se niegan a ejecutarse en un servidor terminal, incluso cuando está utilizando la sesión de la consola, es por razones de licencia, de modo que una licencia no puede ser utilizada por más de una persona al mismo tiempo.
paradroid

Respuestas:

9

Hay varias formas para que una aplicación verifique si se está ejecutando en una sesión de Terminal Server. Algunos de ellos puedes hackear, como se muestra a continuación:

  1. Registro: HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\TSAppCompat.
    Esta clave falta en una sesión normal en mi escritorio.
    Puede intentar eliminarlo, si puede.
  2. Valores de variable de entorno SESSIONNAME: consola / "RDP #" / (vacío).
    Puede intentar ejecutar su juego desde el Símbolo del sistema (cmd) después de hacerlo
    SET SESSIONNAME=Console(mi valor de escritorio) o SET SESSIONNAME=(vacío).
    Para averiguar su valor actual, ingrese SET SESSIONNAMEantes de cambiar cualquier cosa.
  3. El sistema llama a GetSystemMetrics (SM_REMOTESESSION) y GetVersionEx ( OSVERSIONINFOEX.wSuiteMask ) devuelve el contexto de ejecución.
    No puedes hacer mucho contra este, excepto escribir un gancho de sistema para ello.
    Si está interesado, vea este artículo de codeproject.com: se revela el enganche API .
harrymc
fuente
En 2), el nombre de la sesión es "consola" (¿Qué diablos?). La clave TSAppCompat también falta aquí. Sobre el tercero ... Parece difícil de hacer. ¿No hay un programa que se encuentre encima de otro programa e intercepte llamadas del sistema como el que mencioné? GetSystemMetrics.
sinni800
Según su información, probablemente el tercer método es el que vale la pena atacar para GetVersionEx y GetSystemMetrics. He agregado un enlace arriba (para ser utilizado por un programador).
harrymc
Otra nota: si hay una manera de usar MSTSC / admin en SoftXPand, vale la pena intentarlo.
harrymc
@harrymc ¿por qué MSTSC / admin? Examinaré el enganche de la API ... Sin embargo, podría ser demasiado complejo para mis habilidades de programación.
sinni800
"MSTSC / admin" es una posibilidad bastante remota: es un tipo de sesión remota algo diferente, por lo que puede que algunos programas no lo detecten.
harrymc
0

Encontré una solución: ejecutar los programas que desea mediante "runas"

Después de iniciar sesión a través del escritorio, escriba eso en cmd:

runas / usuario: YOUR_NAME "YOUR_PROGRAM_PATH"

Lo probé con los softwares de Bently y funcionan bien.

AqD
fuente
Esto evita el problema del servidor terminal? Interesante, tengo que intentarlo.
sinni800
No funciona con efecto de masa 3 (Este programa no se puede ejecutar de forma remota)
Mgamerz
0

Estoy usando Microsoft Remote Desktop y probé los primeros 2 métodos publicados por @harrymc, pero en mi caso no funcionan. El tercero es demasiado complicado para mí, así que no lo he probado.

Al final, descubrí que Parallel Access me permite usar el programa que mostraba el error. No es tan sencillo como RDP, así que lo uso si realmente tengo que usar el programa.

Lewen
fuente
0

No aborda la pregunta de SoftXPand directamente, pero terminé aquí debido a una búsqueda en Google y está junto a la respuesta de @ harrymc.

Creé un archivo por lotes que tenía un retraso de 60 segundos y luego inicia la aplicación que quiero ejecutar. Comencé el archivo por lotes, salí de mi conexión RDP, esperé unos 5 minutos y luego me reconecté con RDP. La aplicación molesta que quería estaba esperándome cuando volví. Aquí está el contenido del archivo por lotes:

timeout 60

start /D "your path here" yourExecutable.exe

Las comillas alrededor de la ruta son necesarias si tiene espacios en la ruta.

Obtuve la información de lote de aquí: /programming/8324352/creating-a-batch-file-for-programs-to-start-using-a-delay

accesorios para este chico: /programming//users/959263/raihan

(decía proporcionar detalles y compartir mi investigación)

LargoBoom
fuente
Solución interesante, no sé si será capaz de aplicar a SoftXP y, para ser honesto. Como no puedo "salir" de la sesión como con RDP.
sinni800