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

本文关键字:句柄 设置 管道 2008 R2 WS | 更新日期: 2023-09-27 18:16:22

我没有成功打开一个命名管道Windows Server 2008 R2预生产阶段主机我在开发过程中完全没有遇到任何麻烦WS 2008 R2主机(应该配置相同)并测试该管道的操作

应用程序在IIS中有一个WCF RESTful web服务通过命名管道连接到Windows服务。的然后Windows Service通过Perl查询Oracle数据库脚本。但是在预制作阶段,我们因为管道无法打开。

第一个问题是访问冲突。当我痊愈使用pipessecurity实例,我得到一个丢失的句柄例外。我在这两方面都是管理员的主机。我已经打开了所有相关文件夹的访问权限在预生产主机上(是的,我会再次保护它)一旦它工作了)。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();

使用管道安全类解决了一个最初的问题有访问权限(感谢Chris Dickson在2010年的回答)关于设置管道访问)。

但是在设置了访问控制之后,我得到了这个异常:

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

我已经谷歌,直到蓝色的指尖,但没有得到一个有用的答案。看来我早就该这么做了仅通过使用构造函数设置句柄。InitializeHandle

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

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

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

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。