WS 2008 R2上的命名管道未设置句柄

时间:2014-08-03 13:55:14

标签: c# windows-server-2008-r2 named-pipes

我没有成功打开一个命名管道 Windows Server 2008 R2预生产暂存主机 我在开发上开发代码时没有遇到任何麻烦 WS 2008 R2主机(应配置相同) 并测试该管道的操作。

该应用程序在IIS中具有WCF RESTful Web服务 通过命名管道连接到Windows服务。该 Windows Service然后通过Perl查询Oracle DB 脚本。但是对于前期制作的舞台主持人我们 从来没有那么远,因为管道无法打开。

第一个问题是访问冲突。我治好了 使用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类解决了一个初始问题 具有访问权限(感谢Chris Dickson的2010年回答 关于设置管道访问权限。)

但在设置访问控制后,我得到了这个例外:

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

我用Google搜索直到蓝色,但不要 得到一个有用的答案。看来我应该已经拥有了 仅使用构造函数设置句柄。 InitializeHandle 不应该在这里适用。

所以,我期待你在这些方面的专业知识。

1 个答案:

答案 0 :(得分:0)

它可能有权限问题:因此,需要提供所需的访问权限。

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。