C#NamedPipe over network在客户端连接上抛出UnauthorizedAccessException

时间:2018-01-18 16:20:36

标签: c# .net named-pipes access-rules

我有一个客户端和一个NamedPipe服务器。 客户端和服务器在不同的Windows服务上运行。 在同一台机器上,连接完美。 但是当尝试从另一台机器访问服务器时,会抛出UnauthorizedAccessException类型的异常(访问被拒绝)。 我研究了几个帖子并在服务器上包含了AccessRules,但它没有用。 服务器计算机上不存在客户端计算机用户。 这种情况下是否有特定的/ AccessRule设置? 有谁知道解决方案?

服务器:

private NamedPipeServerStream _setupServer;

PipeSecurity ps = new PipeSecurity();
//Everyone
ps.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), PipeAccessRights.ReadWrite, AccessControlType.Allow));
//Users
ps.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null), PipeAccessRights.ReadWrite, AccessControlType.Allow));
//SYSTEM
ps.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null), PipeAccessRights.FullControl, AccessControlType.Allow));

using (_setupServer = new NamedPipeServerStream(typeof(ISetupClient).Name, PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Message, PipeOptions.None, 4024, 4024, ps))
{
     this._setupServer.WaitForConnection();
     //...
}

客户端:

string ipServidor = "192.168.40.155";
using (var setupClient = new NamedPipeClientStream(ipServidor, typeof(ISetupClient).Name, PipeDirection.InOut, PipeOptions.None))
{
    int timeOut = 10;
    setupClient.Connect(timeOut);
    //...
}

1 个答案:

答案 0 :(得分:0)

我不知道为什么这个问题被贬低了 - 我纠正了这个问题。

我在我的实验室中测试了两台不同用户的Win 7机器。

Windows中的远程命名管道超过SMB / CIFS。因此,正常的登录限制适用。

如果我更改了本地安全策略,我能够成功运行:

安全选项

帐户:来宾帐户状态 - 更改为已启用

用户权利分配

拒绝从网络访问此计算机 - 删除"访客"

<强> 警告

这不是一个好主意。我只做了更改以验证这一点,并立即将其更改回来。

本地安全策略中还有一个选项可以添加可以匿名访问的命名管道,但这在我的案例中并不起作用。人们不得不对此进行调查。

在我看来,使用命名管道进行未经身份验证的访问并不是最佳解决方案。通常,我更喜欢经过身份验证的连接,但在我的情况下,我的大多数开发都在企业内部网中,所有计算机都在具有AD用户的Active Directory环境中,因此这很容易。

也许您可以使用在两台计算机上使用相同用户名和相同密码的旧技巧,这将在没有上述策略更改的情况下工作。