Windows: come far credere ai programmi che non sono in esecuzione in una sessione di terminal server?


11

Sto usando il programma "SoftXPand 2011 Duo" di Miniframe sul mio PC Windows 7. Rende due workstation da un computer. Utilizza i servizi terminal integrati in Windows per creare la sessione aggiuntiva. Uso due schermi, due tastiere e due mouse per creare questa "illusione" di due computer. Funziona abbastanza bene e posso persino giocare a due diversi giochi 3D sui due schermi collegati a questa singola macchina (usando un Radeon HD5770 e un Core i5 2500k con 8 Gbytes RAM).

Ci sono alcuni aspetti negativi di questo. Ho appena trovato uno che è nascosto al primo sguardo. Le sessioni in cui ci si trova (anche sulla prima workstation) verranno identificate come sessioni di Terminal Server! Ora alcuni programmi funzioneranno con effetti limitati (grafici) e alcuni non funzioneranno affatto.

Ciò ha comportato anche il mancato funzionamento di alcuni giochi. Dicono solo "Non può essere eseguito in una sessione di terminal server" ed esce. Ho già dimostrato che i migliori giochi moderni (DirectX 10, 11) funzionano esattamente come sulla stessa macchina senza SoftXPand, quindi questa è una limitazione piuttosto artificiale!

Quindi, posso in qualche modo hackerare la mia sessione corrente in modo che non sembri più una sessione di terminal server? IE

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

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

Restituirà FALSO? (Non una domanda di programmazione! Solo un esempio di come i programmi rilevano se si trovano in una sessione di terminal server!)


Hai due tastiere / schermi? Si prega di elaborare un po 'di più sulla configurazione.
harrymc,

@harrymc Sì, lo so. La modifica.
sinni800,

Il motivo per cui le app si rifiutano di essere eseguite su un server terminal, anche quando si utilizza la sessione della console, è a causa di motivi di licenza, quindi una licenza non può essere utilizzata da più di una persona contemporaneamente.
paradroid

Risposte:


9

Esistono diversi modi per un'applicazione per verificare se è in esecuzione in una sessione di Terminal Server. Alcuni di questi potresti hackerare, come di seguito:

  1. Registro di sistema: HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\TSAppCompat.
    Questa chiave manca in una normale sessione sul mio desktop.
    Potresti provare a eliminarlo, se puoi.
  2. Valori delle variabili di ambiente SESSIONNAME: Console / "RDP #" / (vuoto).
    Puoi provare a eseguire il gioco dal prompt dei comandi (cmd) dopo aver eseguito
    SET SESSIONNAME=Console(il mio valore desktop) o SET SESSIONNAME=(vuoto).
    Per scoprire il suo valore attuale, inserire SET SESSIONNAMEprima di modificare qualsiasi cosa.
  3. Il sistema chiama GetSystemMetrics (SM_REMOTESESSION) e GetVersionEx ( OSVERSIONINFOEX.wSuiteMask ) restituiscono il contesto di esecuzione.
    Non puoi fare molto contro questo, tranne scrivere un hook di sistema.
    Se sei interessato, leggi questo articolo su codeproject.com: rivelato il collegamento API .

Su 2), il nome della sessione è "console" (che diamine?). Qui manca anche la chiave TSAppCompat. Circa il terzo ... Sembra difficile da fare. Non c'è un programma che si trova sopra un altro programma e intercetta le chiamate di sistema come quello che ho citato? GetSystemMetrics.
sinni800,

Secondo le tue informazioni, probabilmente il terzo metodo è quello che vale la pena attaccare per GetVersionEx e GetSystemMetrics. Ho aggiunto un link sopra (per essere utilizzato da un programmatore).
harrymc,

Un'altra nota: se esiste un modo per utilizzare MSTSC / admin in SoftXPand, vale la pena provare.
harrymc,

@harrymc perché MSTSC / admin? Esaminerò l'API hooking ... Potrebbe essere troppo complesso per le mie capacità di programmazione.
sinni800,

"MSTSC / admin" è un tiro piuttosto lungo: è un tipo di sessione remota leggermente diverso, quindi forse alcuni programmi potrebbero non rilevarlo.
harrymc,

0

Ho trovato una soluzione: eseguire i programmi desiderati da "runas"

Dopo aver effettuato l'accesso tramite desktop, digita cmd:

runas / user: YOUR_NAME "YOUR_PROGRAM_PATH"

L'ho testato con i software di Bently e funzionano bene.


Questo aggira il problema del terminal server? Interessante, devo provare.
sinni800,

Non funziona con Mass Effect 3 (questo programma non può essere eseguito in remoto)
Mgamerz

0

Sto usando Microsoft Remote Desktop e ho provato i primi 2 metodi pubblicati da @harrymc, ma nel mio caso non funzionano. Il terzo è troppo complicato per me, quindi non ci ho provato.

Alla fine, ho scoperto che Parallel Access mi consente di utilizzare il programma che mostrava l'errore. Non è fluido come RDP, quindi lo uso se devo davvero usare il programma.


0

Non affronta direttamente la domanda su SoftXPand ma sono finito qui a causa di una ricerca su Google ed è la risposta di @ harrymc.

Ho creato un file batch con un ritardo di 60 secondi e quindi avvia l'app che voglio eseguire. Ho avviato il file batch, disconnesso dalla mia connessione RDP, ho aspettato circa 5 minuti e quindi ricollegato con RDP. L'app fastidiosa che volevo mi stava aspettando quando sono tornato. Ecco il contenuto del file batch:

timeout 60

start /D "your path here" yourExecutable.exe

Le virgolette intorno al percorso sono necessarie se si hanno spazi nel percorso.

Ho preso le informazioni sul batch da qui: /programming/8324352/creating-a-batch-file-for-programs-to-start-using-a-delay

oggetti di scena per questo ragazzo: /programming//users/959263/raihan

(diceva di fornire dettagli e condividere la mia ricerca)


Soluzione interessante, non so se sarà in grado di applicare a SoftXPand, per essere onesti. Dato che non posso "lasciare" la sessione come con RDP.
sinni800,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.