Не задан дескриптор именованного канала в WS 2008 R2

Мне не удалось открыть именованный канал на предварительном промежуточном хосте Windows Server 2008 R2, и все же у меня не было никаких проблем с разработкой этого кода на хосте разработки WS 2008 R2 (который должен быть настроен идентично) и тестирование работы этого канала .

Приложение имеет веб-службу WCF RESTful в IIS, которая подключается к службе Windows через именованный канал. Затем служба Windows запрашивает базу данных Oracle с помощью сценария Perl. Но на хосте предварительной подготовки мы никогда не заходим так далеко, потому что канал не открывается.

Первой проблемой было нарушение прав доступа. Когда я вылечил это с помощью экземпляра PipeSecurity, я получил исключение об отсутствующем дескрипторе. Я все работаю как администратор на обоих хостах. Я открыл доступ ко всем связанным папкам на тестовом хосте (да, я защищу его снова, как только он заработает). журналы IIS не показывают ничего необычного в службе WCF.

Вот код с хоста разработки, который работал «из коробки» без проблем.

ClientPipe = new NamedPipeClientStream(
".", "QueryPipe", PipeDirection.InOut, PipeOptions.None,
TokenImpersonationLevel.None);

ClientPipe.Connect();

Просто и прямолинейно.

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

ClientPipe =
    new NamedPipeClientStream(".", "QueryPipe",
      PipeAccessRights.FullControl,
      PipeOptions.None,
      TokenImpersonationLevel.None,
      HandleInheritability.None);

PipeSecurity _ps = new PipeSecurity();

  _ps.AddAccessRule(new PipeAccessRule(
  WindowsIdentity.GetCurrent().User,
    PipeAccessRights.FullControl, AccessControlType.Allow));

_  ps.AddAccessRule(new PipeAccessRule(
    "SYSTEM", PipeAccessRights.FullControl, AccessControlType.Allow));

ClientPipe.SetAccessControl(_ps);

ClientPipe.Connect();

Использование класса PipeSecurity решило первоначальную проблему с правами доступа (благодаря ответу Криса Диксона 2010 года о настройке доступа к каналу).

Но после установки контроля доступа я получаю это исключение:

** Pipe Error: System.InvalidOperationException:
Pipe handle has not been set. 
Did your PipeStream implementation call InitializeHandle?

Я гуглил до посинения кончиков пальцев, но не получил полезного ответа. Кажется, я уже должен был установить дескриптор, просто используя конструктор. InitializeHandle не должен применяться здесь.

Итак, я рассчитываю на ваш опыт в этих вопросах.


person Old Geezer    schedule 03.08.2014    source источник
comment
Да, ты не можешь этого сделать. Именно сервер вызвал SetAccessControl() и составил список гостей, приглашенных на вечеринку. Вы не на нем. Вы не можете внести свое имя в этот список и войти в дверь таким образом. Вы должны иметь представление о том, кто в этом списке, чтобы вы могли выдать себя за одного из них.   -  person Hans Passant    schedule 03.08.2014
comment
... или исправить код на сервере.   -  person Harry Johnston    schedule 04.08.2014
comment
Мой первый шанс попробовать ваши идеи будет завтра утром. Но я все еще озадачен тем, почему все это так хорошо работало в разработке. Казалось бы, две машины не настроены, как мне сказали, идентично.   -  person Old Geezer    schedule 04.08.2014
comment
Ваши поэтические подсказки направили меня в правильном направлении, и я, наконец, нашел свое решение в этой теме: сеанс-0">ссылка. Как нуб, я не знаю, как отметить одного или обоих из вас как ответ.   -  person Old Geezer    schedule 04.08.2014


Ответы (1)


У него может быть проблема с разрешением: поэтому необходимо предоставить необходимые права доступа.

PipeSecurity _pipeSecurity = new PipeSecurity();
                PipeAccessRule psEveryone = new PipeAccessRule("Everyone", PipeAccessRights.FullControl, System.Security.AccessControl.AccessControlType.Allow);


           _pipeSecurity.AddAccessRule(psEveryone);

            NamedPipeServerStream pipeServer = new NamedPipeServerStream(PipeName,
                               PipeDirection.In, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 4, 4, _pipeSecurity);

И чтобы преодолеть проблему прослушивания только один раз, выполните следующие настройки: щелкните правой кнопкой мыши соответствующую службу> Свойства> Войти в систему> Войти как: учетная запись локальной системы и установите флажок Разрешить службе взаимодействовать с рабочим столом. Или перейдите к свойству ServiceProcessInstaller и установите учетную запись как LocalSystem.

person Nitish Kumar    schedule 01.03.2016