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
所以,我期待你在这些方面的专业知识。
可能有权限问题:因此,需要提供所需的访问权限。
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。