Какие методы межпроцессного взаимодействия работают на терминальном сервере? - PullRequest
3 голосов
/ 12 мая 2009

В сеансе терминального сервера некоторые стандартные технологии IPC могут работать не так, как в однопользовательской среде, поскольку требуемые ресурсы не виртуализированы .

Например, порты TCP / IP не виртуализированы, поэтому приложения в разных сеансах, которые пытаются прослушивать один и тот же порт, вызовут конфликт портов.

Какая технология IPC будет работать в среде терминального сервера, где приложения, работающие в одном сеансе пользователя , должны взаимодействовать?

  • Сообщения (WM_COPYDATA)?
  • Именованные каналы?
  • DDE
  • Файлы с отображением в памяти?

Ответы [ 2 ]

4 голосов
/ 19 мая 2009

Сообщения будут работать нормально. DDE тоже будет, поскольку он основан на сообщениях. Именованные каналы не будут, так как они для системы, а не для сессии. Вы также можете рассмотреть COM или OLE.

2 голосов
/ 13 июня 2009

Все IPC могут быть использованы в среде TS - вам просто нужно быть умным в именовании объектов, чтобы достичь требуемого конечного результата. Использование сокетов сложнее, но это можно сделать. Я перечислил несколько методов ниже.

Для объектов IPC, которые могут быть названы (Pipe, Event, Mutex, Memory Mapped File и т. Д.), Включающих идентификатор сеанса в имя объекта, будет достигнута виртуализация . Для дальнейшей блокировки объекта IPC используйте атрибуты безопасности объекта, чтобы предотвратить возможность доступа любого другого пользователя к объекту IPC. Это может произойти случайно в результате ошибки или злонамеренно другого пользователя на сервере терминалов.

Аналогичным образом используйте идентификатор авторизованного пользователя в имени объекта IPC. В C ++ см. MSDN для GetTokenInformation Использование TokenStatistics для класса TokenInformationClass. Я уверен, что есть эквивалентный метод .NET. Снова защитите объект IPC.

Если вы должны использовать сокеты на TS (я лично выбрал бы другой метод для связи между приложениями на TS), тогда используйте номера портов. Выберите базовый номер порта и добавьте номер сеанса, чтобы получить порт, используемый для сеанса. Чтобы убедиться, что правильные приложения обмениваются данными, используйте метод аутентификации и / или подтверждение связи перед передачей данных. Теоретически сеансы могут быть пронумерованы до 65535, так что вы можете отклеиться, когда используете базовый номер порта, скажем, 2000, и сеанс, в котором ваше приложение выполняется в сеансе 65500. Если вы действительно хотите использовать сокеты, то, возможно, вам поможет брокерская служба.

...