Если ваше приложение работает в 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()
.