Windows: Jak sprawić, by programy myślały, że nie działają w sesji serwera terminali?

11

Korzystam z programu „SoftXPand 2011 Duo” firmy Miniframe na komputerze z systemem Windows 7. Tworzy dwie stacje robocze z jednego komputera. Korzysta z usług terminalowych wbudowanych w Windows, aby utworzyć dodatkową sesję. Używam dwóch ekranów, dwóch klawiatur i dwóch myszy, aby stworzyć tę „iluzję” dwóch komputerów. Działa całkiem dobrze i mogę nawet grać w dwie różne gry 3D na dwóch ekranach podłączonych do tej pojedynczej maszyny (używając Radeon HD5770 i Core i5 2500k z 8 GB pamięci RAM).

Jest kilka wad tego. Właśnie znalazłem o jednym, który jest ukryty przy pierwszym spojrzeniu. Sesje, w których jesteś (nawet na pierwszej stacji roboczej) będą identyfikowane jako sesja serwera terminali! Teraz niektóre programy będą działać z ograniczonymi efektami (graficznymi), a niektóre w ogóle nie będą działać.

Spowodowało to również, że niektóre gry w ogóle nie działały. Mówią tylko: „Nie można uruchomić w sesji serwera terminali” i kończą pracę. Udowodniłem już, że najlepsze współczesne gry (DirectX 10, 11) działają tak samo dobrze, jak na tej samej maszynie bez SoftXPand, więc jest to dość sztuczne ograniczenie!

Czy mogę w jakiś sposób zhakować bieżącą sesję, aby nie wyglądała ona jak sesja serwera terminali? TO ZNACZY

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

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

Zwróci FAŁSZ? (To nie jest pytanie programistyczne! Tylko przykład, jak programy wykrywają, czy są w sesji serwera terminali!)

sinni800
źródło
Czy masz dwie klawiatury / ekrany? Opisz trochę więcej na temat konfiguracji.
harrymc
@harrymc Tak, rozumiem. Redagowanie.
sinni800
Powodem, dla którego aplikacje odmawiają uruchomienia na serwerze terminali, nawet podczas korzystania z sesji konsoli, są przyczyny licencyjne - dlatego jedna licencja nie może być używana przez więcej niż jedną osobę w tym samym czasie.
paradroid

Odpowiedzi:

9

Istnieje kilka sposobów sprawdzania, czy aplikacja działa w sesji serwera terminali. Niektóre z nich możesz zhakować, jak poniżej:

  1. Rejestru: HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\TSAppCompat.
    Tego klucza brakuje w normalnej sesji na moim pulpicie.
    Możesz spróbować go usunąć, jeśli możesz.
  2. Wartości zmiennych środowiskowych SESSIONNAME: Console / „RDP #” / (puste).
    Możesz spróbować uruchomić grę z wiersza polecenia (cmd) po wykonaniu
    SET SESSIONNAME=Console(wartość mojego pulpitu) lub SET SESSIONNAME=(pusta).
    Aby sprawdzić aktualną wartość, wprowadź SET SESSIONNAMEprzed zmianą.
  3. Wywołania systemowe GetSystemMetrics (SM_REMOTESESSION) i GetVersionEx ( OSVERSIONINFOEX.wSuiteMask ) zwracają kontekst wykonania.
    Niewiele możesz z tym zrobić, oprócz napisania haka systemowego.
    W razie zainteresowania zapoznaj się z tym artykułem codeproject.com: ujawniono zaczepienie API .
harrymc
źródło
Na 2) nazwa sesji to „konsola” (co do cholery?). Brak tu również klucza TSAppCompat. O trzecim ... Wygląda na trudne. Czy nie ma programu, który stoi na szczycie innego programu i przechwytuje wywołania systemowe, takie jak wspomniane? GetSystemMetrics.
sinni800
Według twoich informacji prawdopodobnie trzecia metoda jest warta ataku dla GetVersionEx i GetSystemMetrics. Dodałem link powyżej (do wykorzystania przez programistę).
harrymc
Kolejna uwaga: jeśli istnieje sposób użycia MSTSC / admin w SoftXPand, warto spróbować.
harrymc
@harrymc dlaczego MSTSC / admin? Zajmę się chwytaniem interfejsu API ... Może to być zbyt skomplikowane dla moich umiejętności programistycznych.
sinni800,
„MSTSC / admin” to dość długa szansa: jest to nieco inny typ sesji zdalnej, więc może niektóre programy mogą go nie wykryć.
harrymc
0

Znalazłem rozwiązanie: uruchamianie żądanych programów przez „runas”

Po zalogowaniu się za pomocą pulpitu wpisz to w cmd:

runy / użytkownik: YOUR_NAME „YOUR_PROGRAM_PATH”

Przetestowałem to na oprogramowaniu Bently i działają dobrze.

AqD
źródło
To obchodzi problem z serwerem terminali? Ciekawe, muszę spróbować.
sinni800
Nie działa z efektem masy 3 (tego programu nie można uruchomić zdalnie)
Mgamerz,
0

Korzystam z Microsoft Remote Desktop i wypróbowałem pierwsze 2 metody opublikowane przez @harrymc, ale w moim przypadku nie działają. Trzeci jest dla mnie zbyt skomplikowany, więc nie spróbowałem.

W końcu odkryłem, że Parallel Access pozwala mi korzystać z programu, który wyświetlał błąd. Nie jest tak płynny jak RDP, więc używam go, jeśli naprawdę muszę korzystać z programu.

Lewen
źródło
0

Nie odnosi się bezpośrednio do pytania SoftXPand, ale znalazłem się tutaj z powodu wyszukiwania w Google i jest to odpowiedź @ harrymc.

Utworzyłem plik wsadowy, który miał opóźnienie 60 sekund, a następnie uruchamia aplikację, którą chcę uruchomić. Uruchomiłem plik wsadowy, wylogowałem się z mojego połączenia RDP, odczekałem około 5 minut, a następnie ponownie połączyłem się z RDP. Ta wstrętna aplikacja, którą chciałem, czekała na mnie, kiedy wróciłem. Oto zawartość pliku wsadowego:

timeout 60

start /D "your path here" yourExecutable.exe

Cytaty wokół ścieżki są konieczne, jeśli masz spacje na ścieżce.

Mam tutaj informacje o partii: /programming/8324352/creating-a-batch-file-for-programs-to-start-using-a-delay

rekwizyty temu facetowi: https://stackoverflow.com/users/959263/raihan

(powiedział, aby podać szczegóły i udostępnić moje badania)

LargoBoom
źródło
Ciekawe rozwiązanie, ale nie wiem, czy będzie mogło zastosować się do SoftXPand, szczerze mówiąc. Ponieważ nie mogę „opuścić” sesji jak w przypadku RDP.
sinni800