Получение EndpointNotFoundException с NetNamedPipeBinding в C #; Нужно создать глобальную именованную трубу - PullRequest
5 голосов
/ 20 сентября 2011

Я использую службу Windows, которой я отправляю сообщения через NetNamedPipeBinding.Сообщения отправляются из клиентского приложения, которое запускается объектом групповой политики.Я только что установил службу и клиент на новом сервере и получаю следующее сообщение:

System.ServiceModel.EndpointNotFoundException: 
There was no endpoint listening at 
net.pipe://localhost/VOXAServices/VOXADefaultPipe that could accept the
message. This is often caused by an incorrect address or SOAP action.
See InnerException, if present, for more details.

Нет внутреннего исключения.Если я запускаю клиентское приложение, дважды щелкнув его значок на рабочем столе, оно запускается без проблем.Я управляю кодом как для службы Windows, так и для клиентского приложения, поэтому я могу изменить все, что мне нужно.Но до сих пор я почти уверен, что привязка, контракт и адрес верны (так как все работает при запуске с рабочего стола).Я считаю, что проблема заключается в том, что клиентское приложение запускается из объекта групповой политики.Но я не могу придумать причину, по которой это может привести к этой ошибке.

ОБНОВЛЕНИЕ:

Я прочитал это на веб-сайте Microsoft:

Именованный канал - это объект в ядре операционной системы Windows, например раздел общей памяти, который процессы могут использовать для связи.Именованный канал имеет имя и может использоваться для односторонней или дуплексной связи между процессами на одном компьютере.

Когда требуется обмен данными между различными приложениями WCF на одном компьютере, и вы хотите предотвратить любыесвязь с другой машины, затем используйте именованные каналы транспорта. Дополнительным ограничением является то, что процессы, запущенные из удаленного рабочего стола Windows, могут быть ограничены одним и тем же сеансом удаленного рабочего стола Windows, если у них нет повышенных привилегий.

( Выбор транспорта , выделение добавлено)

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

ОБНОВЛЕНИЕ № 2:

Похоже, что существует такая вещь, как глобальная и локальная (для сеанса Windows) именованные каналы.Я считаю, что мой Windows-сервис создает локальный именованный канал, и если я смогу заставить его создать глобальный именованный канал, это решит мою проблему.(Это объясняет, почему я не мог видеть свой канал в sysinternals «Process Explorer», даже если мое клиентское приложение могло найти его, если я запустил его из привилегированного сеанса).Проблема в том, что я не знаю (и, похоже, не могу выяснить), как заставить глобально создать именованный канал (c #).Есть идеи?

1 Ответ

3 голосов
/ 27 сентября 2011

Механизм, с помощью которого клиенты WCF находят конечные точки службы NetNamedPipe WCF включает объект общей памяти ядра, который служба использует, чтобы сообщить клиентам фактическое имя канала, который будет использоваться. Если клиенты будут находиться в другом сеансе входа на сервер, этот объект совместно используемой памяти должен находиться в глобальном, а не в локальном пространстве имен ядра. Сами именованные каналы имеют единое пространство имен, видимое для всех клиентов. Вы не можете напрямую управлять пространством имен, используемым WCF для объекта общей памяти, но это будет глобальное пространство имен ядра при условии, что ваш сервер является службой Windows, работающей с SeCreateGlobalPrivilege. Ваш вопрос подразумевает, что это так, поэтому я скептически отношусь к тому, связана ли ваша проблема с пространствами имен объектов ядра.

Две другие возможные причины:

  1. ACL, которые защищают как объект общей памяти, так и именованный канал. Они всегда будут запрещать доступ к любому контексту безопасности, который входит в группу NETWORK USERS (SID S-1-5-2). Это обеспечивает гарантию WCF об отсутствии удаленного доступа к конечным точкам именованных каналов.

  2. Если вы работаете в Vista или более поздней версии, уровень обязательной целостности клиентского процесса не должен быть ниже уровня обязательной целостности объектов ядра (который будет подразумеваться - средний - если вы не приняли специальные шаги по повышению с использованием обязательных меток целостности)

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

...