2010-07-19 4 views
5

В Windows 7 и .NET 4 я получаю очень странные эффекты от WCF с именем pipe transport, когда мой клиент WCF является службой Windows.Почему служба WCF с именем pipe отклоняет клиентские службы Windows?

Служба WCF размещена в приложении пользовательского режима и отображается по привязке именованного канала.

Мой клиент WCF - это служба Windows, работающая как служба сети (я получаю тот же результат, если он работает как локальная система).

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

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

+0

Какое внутреннее исключение? И нет, это не ошибка в рамках. – Will

ответ

4

Из записи в блоге Кристиан Вейер в Dealing with OS privilege 'issues' in WCF Named Pipes scenarios:

Если мой процесс сервера WCF с помощью именованных Pipe на основе конечной точки не имеет привилегий для создания глобального объекта ядра он молча терпит неудачу и создает локальный один, который будет не видны для процессов вне его сеанса.

Таким образом, ни один именованный механизм связи на основе труб (WCF или иначе), открытый процессом без права на создание глобального объекта ядра, никогда не сможет получать сообщения из-за пределов своего собственного сеанса.

Похоже, что это пример закона непреднамеренных последствий, когда наложение на безопасность фактически приводит к тому, что люди открывают больше лазейки безопасности, вынуждая использовать видимые транспорты сети вместо механизма IPC локального компьютера. MS действительно должна обеспечить надлежащий канал IPC для WCF, поскольку текущий именованный транспортный канал не сокращает его.

Проблема заключается в том, что это не особенно необычный сценарий, поскольку служба .NET хочет поговорить с приложением .NET tray, чтобы предоставлять уведомления пользователей. Механизм опроса от приложения лотка к сервису будет работать ... но опрос медленный и ресурсоемкий, и я хотел бы избежать его.

Кто-нибудь знает о более удобном транспорте IPC?

Tim