允许从远程客户端访问命名管道服务器
我想问你如何设置从远程客户端访问我的命名管道服务器。到目前为止,我认为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);
}
是的,命名管道可以从/到远程计算机。见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
实例。但是,不要指望得到任何支持:)
这
自PipeStream点击率是这样实现的VAR transmissionMode = (PipeTransmissionMode)((INT)PipeTransmissionMode.Byte |(0x8中>> 1));
不应该工作:
如果(transmissionMode < PipeTransmissionMode.Byte || transmissionMode> PipeTransmissionMode.Message) 抛出新ArgumentOutOfRangeException( “transmissionMode”,SR .GetString( “ArgumentOutOfRange_TransmissionModeByteOrMsg”));
我想指出,允许从计算机A访问NamedPipeServer运行的计算机B并非易事。请参阅http://stackoverflow.com/questions/719353/win32-named-pipes-and-remote-clients以获取更多信息 – user2126375 2014-10-04 19:23:08