【问题标题】:Handle Not Set for a Named Pipe on WS 2008 R2未为 WS 2008 R2 上的命名管道设置句柄
【发布时间】:2014-09-26 03:22:29
【问题描述】:

我没有成功打开一个命名管道 Windows Server 2008 R2 预生产暂存主机 我在开发中开发该代码完全没有问题 WS 2008 R2 主机(应配置相同) 并测试该管道的操作。

应用程序在 IIS 中有一个 WCF RESTful Web 服务,该服务 通过命名管道连接到 Windows 服务。这 然后 Windows 服务通过 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 上搜索到指尖变蓝,但没有 得到有用的答案。看来我应该已经有了 仅使用构造函数设置句柄。初始化句柄 不应该在这里应用。

所以,我期待您在这些问题上的专业知识。

【问题讨论】:

  • 是的,你不能那样做。 服务器调用了SetAccessControl(),列出了邀请参加聚会的客人。你不在上面。你不能把你自己的名字放在那个名单上,然后这样进门。你必须知道谁在名单上,这样你就可以冒充他们中的一个。
  • ...或者修复服务器中的代码。
  • 我第一次尝试你的想法的机会是明天上午。但我仍然对为什么它在开发中运行得这么好感到困惑。看起来这两台机器的配置并不像我被告知的那样。
  • 你的诗意线索将我引向了正确的方向,我终于在这个帖子中找到了我的解决方案:link。作为菜鸟,我不确定如何将你们中的一个或两个标记为“答案”。

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


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多