Сделать хост WCF с привязкой к сетевому имени доступным для всех пользователей Windows 10

#windows #wcf #wcf-binding

Вопрос:

У меня есть два приложения, взаимодействующие с протоколом WCF в привязке NetNamedPipeBinding. Один из них-служба («S»), запущенная в СИСТЕМЕ, другой-приложение («A»). Буква «А» создает службу WCF.

Когда «А» запускается с правами администратора, все работает. Но при запуске под ограниченным пользователем «A» может создать службу WCF, до которой «S» не может добраться. Ошибка в том, что:

 System.ServiceModel.EndpointNotFoundException: There was no endpoint listening at net.pipe://app/results that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. ---> System.IO.PipeException: The pipe endpoint 'net.pipe://app/results' could not be found on your local machine. 
 

Идея заключается в том, что эта служба WCF должна быть доступна каждому пользователю (все учетные данные).
Можно ли это сделать с помощью привязки NetNamedPipeBinding? Предпочтительно выполнять всю конфигурацию в коде, а не в файле конфигурации.

         var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
        var baseAddress = new Uri(url);
        var serviceHost = new ServiceHost(implementor);
        serviceHost.AddServiceEndpoint(typeof(IImplementor), binding, baseAddress);
        serviceHost.Open();
 

Комментарии:

1. Я нашел решение переключиться на привязку HTTP и запустить «netsh». Но было бы неплохо знать, как реализовать подобную логику в коде.

Ответ №1:

Если код один и тот же, но пользователь доступа другой, это означает, что пользователи, не являющиеся администраторами, не могут получить доступ к службе.

Возможно, вы можете попробовать приведенный ниже пример.Это все равно не работает,вы можете отправить файл с ошибкой официальному лицу.

https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.netnamedpipebinding?view=netframework-4.8

Спасибо.

Комментарии:

1. Спасибо вам за ваш ответ. Я сделал примерно тот же код, и он не работает между пользователями. Вместо этого мне пришлось иметь дело с привязкой WSDualHttpBinding и разрешить пользователю доступ к общему пространству имен. Теперь это работает. AFAIU проблема заключается в ограничениях привязки Netnamedpip. Вы просто не можете указать базовые каналы на глобальное пространство имен// и добавить ACL, позволяющий любому работать с ним. Ладно, в любом случае моя местная проблема решена.