允许从远程客户端访问命名管道服务器

时间:2014-10-03 17:02:24

标签: .net namedpipeserverstream

我想问你如何设置从远程客户端访问我的命名管道服务器的可能性。到目前为止,我认为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);
    }

2 个答案:

答案 0 :(得分:0)

是的,命名管道可以来自/到远程计算机。请参阅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参数的新值中使用OR。例如:

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

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

答案 1 :(得分:0)

这个

  

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

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

  

if(transmissionMode< PipeTransmissionMode.Byte || transmissionMode> PipeTransmissionMode.Message)           抛出新的ArgumentOutOfRangeException(" transmissionMode",SR.GetString(" ArgumentOutOfRange_TransmissionModeByteOrMsg"));