首页 > 解决方案 > 从远程计算机连接到 namedpipeserver

问题描述

我想使用 namedpipeserver/client 在网络中两台计算机上的两个应用程序之间进行通信。该网络是 SOHO 架构,因此安全性不是那么重要,我们目前只是在尝试让系统启动并运行。

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

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

我已经搜索了高低,发现了一些有趣的文章,例如:

在域中设置命名管道安全性

命名管道客户端无法连接到作为网络服务运行的服务器

NamedPipeClientStream 在 session 0 下无法访问 NamedPipeServerStream

跨网络命名管道给出“用户名或密码不正确”

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

        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);

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

标签: c#named-pipes

解决方案


尝试:

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)

为我工作得很好。


推荐阅读