0

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

2 回答 2

0

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

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

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

可以想象你可以潜入PIPE_REJECT_REMOTE_CLIENTS那里(PIPE_ACCEPT_REMOTE_CLIENTS为零,所以你不需要做任何事情来支持它)。您必须为PipeTransmissionMode参数输入一个新值。例如:

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

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

于 2014-10-03T19:42:14.837 回答
0

这个

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

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

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

于 2017-03-30T08:57:52.710 回答