Windows: Wie kann man Programme glauben lassen, dass sie nicht in einer Terminalserversitzung ausgeführt werden?

11

Ich verwende das Programm "SoftXPand 2011 Duo" von Miniframe auf meinem Windows 7-PC. Es macht zwei Workstations aus einem Computer. Es verwendet die in Windows integrierten Terminaldienste, um die zusätzliche Sitzung zu erstellen. Ich benutze zwei Bildschirme, zwei Tastaturen und zwei Mäuse, um diese "Illusion" von zwei Computern zu erzeugen. Es funktioniert ganz gut und ich kann sogar zwei verschiedene 3D-Spiele auf den beiden Bildschirmen spielen, die an diesen einzelnen Computer angeschlossen sind (mit einer Radeon HD5770 und einem Core i5 2500k mit 8 GB RAM).

Dies hat einige Nachteile. Ich habe gerade eine gefunden, die auf den ersten Blick versteckt ist. Die Sitzungen, an denen Sie teilnehmen (auch auf der ersten Workstation), werden als Terminalserversitzung identifiziert! Jetzt werden einige Programme mit begrenzten Effekten (grafisch) ausgeführt, andere überhaupt nicht.

Dies führte auch dazu, dass einige Spiele überhaupt nicht ausgeführt wurden. Sie sagen nur "Kann nicht in einer Terminalserversitzung ausgeführt werden" und beenden. Ich habe bereits bewiesen, dass moderne Top-Spiele (DirectX 10, 11) genauso gut laufen wie auf demselben Computer ohne SoftXPand. Dies ist also eine ziemlich künstliche Einschränkung!

Kann ich meine aktuelle Sitzung irgendwie hacken, damit sie nicht mehr wie eine Terminalserversitzung aussieht? IE

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

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

Wird FALSE zurückkehren? (Keine Programmierfrage! Nur ein Beispiel, wie Programme erkennen, ob sie sich in einer Terminalserversitzung befinden!)

sinni800
quelle
Haben Sie zwei Tastaturen / Bildschirme? Bitte erläutern Sie Ihr Setup.
Harrymc
@harmmc Ja, das tue ich. Bearbeitung.
sinni800
Der Grund, warum Apps die Ausführung auf einem Terminalserver verweigern, selbst wenn Sie die Konsolensitzung verwenden, liegt in Lizenzierungsgründen, sodass eine Lizenz nicht von mehr als einer Person gleichzeitig verwendet werden kann.
Paradroid

Antworten:

9

Es gibt verschiedene Möglichkeiten für eine Anwendung, um zu überprüfen, ob sie in einer Terminalserversitzung ausgeführt wird. Einige davon könnten Sie wie folgt hacken:

  1. Registrierung : HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\TSAppCompat.
    Dieser Schlüssel fehlt in einer normalen Sitzung auf meinem Desktop.
    Sie könnten versuchen, es zu löschen, wenn Sie können.
  2. Umgebungsvariablenwerte von SESSIONNAME: Console / "RDP #" / (leer).
    Sie können versuchen, Ihr Spiel über die Eingabeaufforderung (cmd) auszuführen, nachdem Sie
    SET SESSIONNAME=Console(mein Desktop-Wert) oder SET SESSIONNAME=(leer) ausgeführt haben.
    Geben Sie ein, SET SESSIONNAMEbevor Sie Änderungen vornehmen , um den aktuellen Wert zu ermitteln .
  3. Das System ruft GetSystemMetrics (SM_REMOTESESSION) und GetVersionEx ( OSVERSIONINFOEX.wSuiteMask ) zurückkehren den Ausführungskontext.
    Gegen diesen kann man nicht viel tun, außer einen System-Hook dafür zu schreiben.
    Bei Interesse lesen Sie diesen Artikel auf codeproject.com: API-Hooking enthüllt .
harrymc
quelle
Bei 2) lautet der Sitzungsname "Konsole" (Was zum Teufel?). Auch hier fehlt der Schlüssel TSAppCompat. Über den dritten ... Sieht schwer zu tun. Gibt es nicht ein Programm, das über einem anderen Programm sitzt und Systemaufrufe wie den von mir erwähnten abfängt? GetSystemMetrics.
sinni800
Nach Ihren Angaben ist die dritte Methode wahrscheinlich diejenige, die es wert ist, für GetVersionEx und GetSystemMetrics angegriffen zu werden. Ich habe oben einen Link hinzugefügt (der von einem Programmierer verwendet werden soll).
Harrymc
Noch ein Hinweis: Wenn es eine Möglichkeit gibt, MSTSC / admin in SoftXPand zu verwenden, ist dies einen Versuch wert.
Harrymc
@harmmc warum MSTSC / admin? Ich werde mich mit dem API-Hooking befassen ... Es könnte jedoch zu komplex für meine Programmierfähigkeiten sein.
sinni800
"MSTSC / admin" ist ein ziemlich langer Versuch: Es handelt sich um einen etwas anderen Remote-Sitzungstyp, sodass einige Programme ihn möglicherweise nicht erkennen.
Harrymc
0

Ich habe eine Lösung gefunden: Ausführen der gewünschten Programme mit "runas"

Nachdem Sie sich über den Desktop angemeldet haben, geben Sie dies in cmd ein:

runas / user: YOUR_NAME "YOUR_PROGRAM_PATH"

Ich habe es mit Bentlys Software getestet und sie funktionieren gut.

AqD
quelle
Dies umgeht das Terminal-Server-Problem? Interessant, ich muss es versuchen.
sinni800
Funktioniert nicht mit Masseneffekt 3 (Dieses Programm kann nicht remote ausgeführt werden)
Mgamerz
0

Ich verwende Microsoft Remote Desktop und habe die ersten beiden von @harrymc veröffentlichten Methoden ausprobiert, aber sie funktionieren in meinem Fall nicht. Der dritte ist mir zu kompliziert, deshalb habe ich ihn nicht ausprobiert.

Am Ende stellte ich fest, dass Parallel Access es mir ermöglicht, das Programm zu verwenden, bei dem der Fehler angezeigt wurde. Es ist nicht so flüssig wie RDP, also benutze ich es, wenn ich das Programm wirklich benutzen muss.

Lewen
quelle
0

Die SoftXPand-Frage wird nicht direkt angesprochen, aber ich bin wegen einer Google-Suche hier gelandet und sie ist die Antwort von @ harrymc.

Ich habe eine Batchdatei mit einer Verzögerung von 60 Sekunden erstellt und dann die App gestartet, die ich ausführen möchte. Ich habe die Batchdatei gestartet, mich von meiner RDP-Verbindung abgemeldet, ungefähr 5 Minuten gewartet und mich dann wieder mit RDP verbunden. Die nervige App, die ich wollte, wartete auf mich, als ich wieder einstieg. Hier ist der Inhalt der Batchdatei:

timeout 60

start /D "your path here" yourExecutable.exe

Die Anführungszeichen um den Pfad sind erforderlich, wenn der Pfad Leerzeichen enthält.

Habe die Batch-Infos von hier: /programming/8324352/creating-a-batch-file-for-programs-to-start-using-a-delay

Requisiten an diesen Typen: /programming//users/959263/raihan

(Es soll Details liefern und meine Forschung teilen)

LargoBoom
quelle
Interessante Lösung, ich weiß jedoch nicht, ob sie auf SoftXPand angewendet werden kann, um ehrlich zu sein. Da ich die Sitzung nicht wie bei RDP "verlassen" kann.
sinni800