【问题标题】:Allow access to Named Pipe Server from remote clients允许从远程客户端访问命名管道服务器
【发布时间】:2014-10-03 17:02:24
【问题描述】:

我想问您如何设置从远程客户端对我的命名管道服务器的可能访问。到目前为止,我认为 NamedPipes 只能用于同一台计算机上的进程间通信,但基于 http://msdn.microsoft.com/en-us/library/windows/desktop/aa365150%28v=vs.85%29.aspx 应该可以通过设置 PIPE_ACCEPT_REMOTE_CLIENTS / PIPE_REJECT_REMOTE_CLIENTS 来允许/不允许从远程计算机访问。我没有找到如何在 .NET 中设置此功能的简单方法。我想 PipeSecurity 可以以某种方式用于它,但我没有找到简单的方法。

我当前的解决方案允许所有用户访问我当前机器上的命名管道。有人可以改进我的解决方案以允许从另一台机器进行访问吗?

谢谢。

    public NamedPipeServerStream CreateNamedPipeServer(string pipeName)
    {
            const int BufferSize = 65535; 
            var pipeSecurity = new PipeSecurity();
            pipeSecurity.AddAccessRule(new PipeAccessRule("Users", PipeAccessRights.ReadWrite, AccessControlType.Allow));
            pipeSecurity.AddAccessRule(new PipeAccessRule("Administrators", PipeAccessRights.ReadWrite, AccessControlType.Allow));

            return new NamedPipeServerStream(pipeName, PipeDirection.InOut, countOfServerInstancesToCreate, PipeTransmissionMode.Message, PipeOptions.Asynchronous,
                                                               BufferSize,
                                                               BufferSize);
    }

【问题讨论】:

标签: .net namedpipeserverstream


【解决方案1】:

是的,命名管道可以来自/到远程计算机。详情见http://msdn.microsoft.com/en-us/library/windows/desktop/aa365590(v=vs.85).aspx

命名管道可用于在同一台计算机上的进程之间或跨网络的不同计算机上的进程之间提供通信。

但是,.NET 不直接支持此选项。 NamedPipeServerStream 构造函数将 PipeTransmisionMode 转换为原生 dwPipeMode 参数,因此您无法直接访问它。

可以想象,您可以PIPE_REJECT_REMOTE_CLIENTS 潜入其中(PIPE_ACCEPT_REMOTE_CLIENTS 为零,因此您无需做任何事情来支持它)。您必须为 PipeTransmissionMode 参数添加一个新值。例如:

var transmissionMode =
    (PipeTransmissionMode)((int)PipeTransmissionMode.Byte | (0x8 >> 1));

然后使用transmissionMode 创建一个NamedPipeServerStream 实例。但是,不要指望它有任何支持:)

【讨论】:

    【解决方案2】:

    这个

    var 传输模式 = (PipeTransmissionMode)((int)PipeTransmissionMode.Byte | (0x8 >> 1));

    不应该工作,因为 PipeStream ctr 是这样实现的:

    if (transmissionMode PipeTransmissionMode.Message) throw new ArgumentOutOfRangeException("transmissionMode", SR.GetString("ArgumentOutOfRange_TransmissionModeByteOrMsg"));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2011-10-04
      • 1970-01-01
      • 2012-10-18
      相关资源
      最近更新 更多