Windows: Как заставить программы думать, что они не работают в сеансе сервера терминалов?

11

Я использую программу "SoftXPand 2011 Duo" от Miniframe на моем ПК с Windows 7. Это делает две рабочие станции из одного компьютера. Он использует терминальные службы, встроенные в Windows, для создания дополнительного сеанса. Я использую два экрана, две клавиатуры и две мыши, чтобы создать эту «иллюзию» двух компьютеров. Он работает довольно хорошо, и я даже могу играть в две разные 3D-игры на двух экранах, подключенных к этой машине (используя Radeon HD5770 и Core i5 2500k с 8 Гбайт ОЗУ).

У этого есть несколько недостатков. Я только что нашел один, который скрыт с первого взгляда. Сеансы, в которых вы находитесь (даже на первой рабочей станции), будут идентифицироваться как сеанс сервера терминалов! Теперь некоторые программы будут работать с ограниченными эффектами (графическими), а некоторые вообще не будут работать.

Это также привело к тому, что некоторые игры вообще не запускались. Они просто говорят «Невозможно запустить в сеансе сервера терминалов» и завершают работу. Я уже доказал, что лучшие современные игры (DirectX 10, 11) работают так же хорошо, как и на той же машине без SoftXPand, так что это довольно искусственное ограничение!

Итак, могу ли я каким-то образом взломать мой текущий сеанс, чтобы он больше не выглядел как сеанс сервера терминалов? IE

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

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

Вернет ЛОЖЬ? (Не вопрос программирования! Просто пример того, как программы определяют, находятся ли они в сеансе сервера терминалов!)

sinni800
источник
У вас есть две клавиатуры / экраны? Пожалуйста, опишите подробнее о вашей настройке.
harrymc
@harrymc Да, я делаю. Редактирование.
sinni800
Причины, по которым приложения отказываются запускаться на сервере терминалов, даже когда вы используете консольный сеанс, вызваны причинами лицензирования - поэтому одна лицензия не может использоваться более чем одним человеком одновременно.
Парадроид

Ответы:

9

У приложения есть несколько способов проверить, работает ли оно в сеансе сервера терминалов. Некоторые из них вы можете взломать, как показано ниже:

  1. Реестр: HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\TSAppCompat.
    Этот ключ отсутствует в обычном сеансе на моем рабочем столе.
    Вы можете попытаться удалить его, если можете.
  2. Значения переменных среды SESSIONNAME: Console / "RDP #" / (пусто).
    Вы можете попробовать запустить игру из командной строки (cmd) после выполнения
    SET SESSIONNAME=Console(значение моего рабочего стола) или SET SESSIONNAME=(пусто).
    Чтобы узнать его текущее значение, введите, SET SESSIONNAMEпрежде чем что-либо менять.
  3. Системные вызовы GetSystemMetrics (SM_REMOTESESSION) и GetVersionEx ( OSVERSIONINFOEX.wSuiteMask ) возвращают контекст выполнения.
    Вы не можете ничего сделать против этого, кроме написания системного хука для этого.
    Если интересно, посмотрите эту статью на codeproject.com: выявлена ​​перехват API .
harrymc
источник
На 2), сессия называется "консоль" (какого черта?). Ключ TSAppCompat здесь также отсутствует. Насчет третьего ... Выглядит сложно. Разве нет программы, которая находится поверх другой программы и перехватывает системные вызовы, подобные той, которую я упомянул? GetSystemMetrics.
sinni800
Согласно вашей информации, вероятно, стоит атаковать третий метод для GetVersionEx и GetSystemMetrics. Я добавил ссылку выше (для использования программистом).
Harrymc
Еще одно замечание: если есть способ использовать MSTSC / admin в SoftXPand, это стоит попробовать.
Harrymc
@harrymc, почему MSTSC / admin? Я посмотрю на API-перехват ... Хотя это может быть слишком сложно для моих способностей программирования.
sinni800
«MSTSC / admin» - это довольно длинный путь: это несколько иной тип удаленного сеанса, поэтому, возможно, некоторые программы могут его не обнаружить.
harrymc
0

Я нашел решение: запуск нужных программ с помощью «runas»

После входа через рабочий стол введите это в cmd:

runas / user: YOUR_NAME "YOUR_PROGRAM_PATH"

Я проверил его на программном обеспечении Bently, и они работают хорошо.

AQD
источник
Это обходит проблему с терминальным сервером? Интересно, я должен попробовать.
sinni800
Не работает с массовым эффектом 3 (Эту программу нельзя запустить удаленно)
Mgamerz
0

Я использую Microsoft Remote Desktop и попробовал первые 2 метода, опубликованные @harrymc, но они не работают в моем случае. Третий слишком сложен для меня, поэтому я не попробовал.

В конце концов я обнаружил, что параллельный доступ позволяет мне использовать программу, которая показала ошибку. Это не так гладко, как RDP, поэтому я использую его, если мне действительно нужно использовать программу.

Lewen
источник
0

Непосредственно не отвечает на вопрос SoftXPand, но я попал сюда из-за поиска в Google, и он соответствует ответу @ harrymc.

Я создал пакетный файл с задержкой 60 секунд, а затем запускает приложение, которое хочу запустить. Я запустил пакетный файл, вышел из соединения RDP, подождал около 5 минут, а затем снова подключился к RDP. Раздражающее приложение, которое я хотел, ждало меня, когда я вернулся. Вот содержимое пакетного файла:

timeout 60

start /D "your path here" yourExecutable.exe

Кавычки вокруг пути необходимы, если в пути есть пробелы.

Получил информацию о пакете отсюда: /programming/8324352/creating-a-batch-file-for-programs-to-start-using-a-delay

реквизиты этому парню: https://stackoverflow.com/users/959263/raihan

(сказано предоставить детали и поделиться своими исследованиями)

LargoBoom
источник
Интересное решение, я не знаю, сможет ли оно применяться к SoftXP, хотя, если честно. Как я не могу «покинуть» сессию, как с RDP.
sinni800