从远程计算机连接到namedpipeserver

时间:2018-08-27 06:12:56

标签: c# named-pipes

我想使用namedpipeserver / client在网络中两台计算机上的两个应用程序之间进行通信。该网络是SOHO体系结构,因此安全性受到的关注较小,我们目前正在尝试使系统正常运行。

我编写了一个任务栏应用程序(用于打开服务器)(在计算机A上)和一个winform应用程序,该应用程序连接到服务器(在计算机B上)。在同一台计算机上同时运行这两个功能可以实现功能上的交互。

在两台计算机上尝试都会出现错误“ System.IO.IOException:“ Der Benutzername oder das Kennwort ist falsch”。(英语:“用户名或密码不正确”)

我已经搜索了很多内容,发现了一些有趣的文章,例如:

Setting named pipe security in a Domain

Named pipe client unable to connect to server running as Network Service

NamedPipeClientStream can not access to NamedPipeServerStream under session 0

Named Pipes Across Network Gives "The user name or password is incorrect"

我相应地更改了服务器的安全设置:

        PipeSecurity pipeSa = new PipeSecurity();
        // Set the pipesecurity
        pipeSa.SetAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null),
                        PipeAccessRights.ReadWrite, AccessControlType.Allow));
        // Alternative with "everyone"
        // pipeSa.SetAccessRule(@"Jeder", PipeAccessRights.ReadWrite, AccessControlType.Allow));

        serverPipeStream = new NamedPipeServerStream(
            pipeName,
            PipeDirection.InOut,
            NamedPipeServerStream.MaxAllowedServerInstances,
            PipeTransmissionMode.Message,
            PipeOptions.Asynchronous,
            10,
            10,
            pipeSa);

A,没有成功。我还检查了两台计算机上防火墙的端口设置,并且无法连接。对于如何进一步解决此问题或我做错了什么的任何提示,将不胜感激。

1 个答案:

答案 0 :(得分:0)

尝试:

var sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
var account = (NTAccount)sid.Translate(typeof(NTAccount));
var rule = new PipeAccessRule(
    account.ToString(), 
    PipeAccessRights.FullControl, 
    AccessControlType.Allow);
var securityPipe = new PipeSecurity();
securityPipe.AddAccessRule(rule);

var pipeserver = new NamedPipeServerStream(
    Name, 
    PipeDirection.InOut, 
    NamedPipeServerStream.MaxAllowedServerInstances, 
    PipeTransmissionMode.Message, 
    PipeOptions.None, 
    0, 
    0, 
    securityPipe)

对我来说很好。