Взаимодействие с .NET Remoting - PullRequest
       24

Взаимодействие с .NET Remoting

3 голосов
/ 22 февраля 2010

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

Обновление: у меня все хорошо с WCF, вопрос не только в удаленном взаимодействии, но в том, как установить именованный канал как локальный для сеанса.

Ответы [ 3 ]

2 голосов
/ 31 января 2011

Если ваше приложение работает в Windows Vista или Windows 7, и вы используете WCF NetNamedPipeBinding, вы автоматически получите службу, доступную только в том же сеансе, ПРЕДОСТАВЛЯЕМОМ, что процесс, реализующий конец службы в канале не имеет привилегии SeCreateGlobalPrivilege. На практике это обычно означает, что сервером может быть любая программа, запущенная в интерактивном сеансе, при условии, что она не запущена с помощью Администратора запуска от имени.

Причина, по которой это так, касается именованного объекта общей памяти, который WCF создает для публикации фактического имени канала (GUID) потенциальным клиентам. Я объясняю этот механизм в своем блоге . Если процесс службы имеет SeCreateGlobalPrivilege, этот объект публикации создается в глобальном пространстве имен ядра, видимом для всех сеансов; если у него нет этой привилегии, объект создается в пространстве имен локального ядра, видимом только в том же сеансе. Обратите внимание, что это не обеспечивает абсолютную безопасность: теоретически к самому именованному каналу можно было бы получить доступ из другого сеанса (используя собственные вызовы API, а не клиентский стек WCF), если GUID имени канала был каким-то образом раскрыт другим способом.

Если вам требуется поддержка более ранней ОС или если вы хотите абсолютную безопасность на самом канале, вам нужно будет явно ввести ограничение, изменив DACL на канале после того, как стек канала службы WCF создал его. Это требует некоторой переделки со стандартным связыванием, и я показываю , как это можно сделать здесь . Вам также потребуется написать некоторый код P / Invoke, который не особенно прост, чтобы найти правильный SID сеанса входа в систему, для которого необходимо создать ACE в DACL. В .NET 4 стек службы WCF сам обнаруживает и использует SID входа в систему, чтобы ограничить разрешение на создание новых экземпляров канала, поэтому вы можете использовать Reflector, чтобы посмотреть, как он это делает - см .: System.ServiceModel.Channels.SecurityDescriptorHelper.GetProcessLogonSid().

1 голос
/ 30 января 2011

Я изучал эту проблему. Лучшее решение, которое я нашел (но еще не пробовал), - это создать уникальное имя именованного канала, используя идентификатор сеанса .

0 голосов
/ 22 февраля 2010

Я бы порекомендовал использовать для этого Windows Communication Foundation .

У вас будет возможность настроить без использования реестра все различные параметры связи, включая использование именованных каналов, сокетов и т. Д.

...