Windows предоставляет ряд прокладки для обхода ошибок и ограничений в программах.
Прокладки могут лгать программе обо всем
Можно ли соврать о том, что программное обеспечение запустить из Терминального сеанса (например, удаленный рабочий стол)?
у меня есть программа, которая определяет, работает ли она в терминальном сеансе, и изменения его поведение соответственно. Еще одна программа отказывается для запуска, потому что он говорит, что он просто не поддерживается.
И, как программа, которая отказывается работать на более поздних версиях, чем Windows 2000, она может работать нормально - если только дает себе шанс.
Есть ли "ложь терминальной сессии"прокладка?
Представьте себе псевдокод это содержит:
static class Program
{
if (System.Windows.Forms.SystemInformation.TerminalServerSession)
{
System.Environment.FastFail("We're too lazy to make our software work under TS.");
}
...
}
Другие приложения изменяют свое поведение в терминальном сеансе:
//Don't enable animations if we're in a TS window, or on battery
Boolean animationsEnabled =
(!System.Windows.Forms.SystemInformation.TerminalServerSession)
&&
(System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus !=
PowerLineStatus.Offline);
Я хочу, чтобы Windows лгала приложению, чтобы оно не думало, что оно запущено в сеансе терминала / сеансе удаленного рабочего стола.
Это похоже на то, как другие программы не умеют писать код проверки версии и поэтому терпят неудачу на чем-либо новее, чем Windows XP:
static class Program
{
//Make sure we're on Windows 5.0 or later:
if (!(WinMajorVersion >= 5) && !(WinMinorVersion >= 0))
FastFail("Requires Windows XP or later");
}
Приведенная выше подсказка кода не работает в версиях Windows 6.0 - именно по этой причине существуют прокладки лжи версии.
Я не верю, что это возможно. Конкретный код флага, на который, вероятно, смотрит ваша программа, - это SM_REMOTESESSION
флаг. Как указал SQLChicken, вы можете победить это для одного пользователя, пытаясь захватить сеанс консоли, который оставит вас с SM_REMOTESESSION = 0
, но я не думаю, что для нескольких пользователей это невозможно.
Я понимаю, что это разочаровывает, но вам, вероятно, придется работать с поставщиком программы, чтобы решить эту проблему. Это большая работа по исправлению программного обеспечения, которое плохо себя ведет под TS, поскольку это обычно вызвано дрянным менталитетом Windows, что все компьютеры - это просто карманные компьютеры с большим экраном, и о множестве пользователей не может быть и речи (а сеть действительно для опытных пользователей). Проблемы, вызванные этим, не ограничиваются описанной вами функцией «Не могу беспокоиться о тестировании» (что-то вроде этого:
#include <windows.h>
#pragma comment(lib, "user32.lib")
BOOL IsRemoteSession(void)
{
return GetSystemMetrics( SM_REMOTESESSION );
}
), но также использование общих ресурсов и правильное использование графики (причина, по которой это на самом деле трудно сделать правильно, - обсуждается Раймондом Ченом).
Поэтому, если у вас нет какого-либо другого механизма, чтобы доказать, что программное обеспечение правильно работает с несколькими пользователями, я был бы склонен предположить, что поражение SM_REMOTESESSION
чека на самом деле было бы недостаточно.
Я немного смущен, но я попробую это сделать. Что касается удаленного подключения к серверу с использованием RDP, вы можете использовать консольное соединение, чтобы запускать приложения, которым требуется это состояние консоли. Нажмите Пуск -> Выполнить и введите mstsc.exe /? (без одинарных кавычек). Это вызовет переключатели справки для любой версии RDP, которую вы сейчас используете. Эти переключатели можно использовать для запуска RDP с помощью сеанса консоли. Например, для версии, которую я сейчас использую (Windows 7 RC), я бы набрал mstsc.exe / v: exampleserver / admin, чтобы подключиться к сеансу консоли для сервера с именем exampleserver. Имейте в виду, что есть различия в версиях RDP, потому что этот переключатель / admin раньше был / console. Если вы хотите быть уверенным, подключитесь к целевому серверу и запустите его /? команду и посмотрите, что она ожидает от консольного подключения.
Обходной путь, а не решение.
Вы хотите запустить единое программное обеспечение для управления или предоставить приложение для терминального сервера?
Если бы это было раньше, вы могли бы использовать что-то вроде VNC / LogMeIn для подключения к консоли - и система не узнала бы, что вы подключены удаленно.
Опасность в последнем случае заключается в том, что некоторые приложения используют общие ресурсы (используемое нами приложение имеет одинаковые временные файлы, поэтому несколько пользователей вызывают повреждение) и просто не могут работать на терминальном сервере в нескольких экземплярах из-за плохой конструкции.