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

本文关键字:网络服务 运行 服务器 连接 管道 客户端 | 更新日期: 2023-09-27 18:05:15

我在网络服务帐户下运行了一个服务。该服务只是设置一个命名管道并监听连接:

NamedPipeServerStream listeningPipe = new NamedPipeServerStream("ourservicepipe",
    PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances, 
    PipeTransmissionMode.Message, PipeOptions.Asynchronous);
listeningPipe.BeginWaitForConnection(OnPipeConnected, listeningPipe);

我有一个应用程序在同一台机器上的标准用户帐户上运行。它尝试连接到由服务创建的命名管道:

NamedPipeClientStream pipe = new NamedPipeClientStream(".", "ourservicepipe", 
    PipeDirection.InOut, PipeOptions.Asynchronous);
pipe.Connect(2000);
pipe.ReadMode = PipeTransmissionMode.Message;

当我调用Connect时,它最终抛出一个InvalidOperationException。如果我在同一个用户上运行服务,它连接得很好。如果我以管理员身份运行客户端,它连接良好。这让我相信问题出在权限上,但是我不知道在安装过程中我需要设置哪些权限。

如何允许客户端连接到服务器,而不需要客户端以管理员身份运行?

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

使用默认的服务DACL创建管道服务器,以便只有管理员或系统用户可以连接到管道。您需要使用适当的访问规则设置管道服务器,以使所有客户端连接成功。下面是设置访问规则以访问每个人访问管道的代码:

    PipeSecurity pipeSa = new PipeSecurity(); 
    pipeSa.SetAccessRule(new PipeAccessRule("Everyone", 
                    PipeAccessRights.ReadWrite, AccessControlType.Allow)); 
    listeningPipe.SetAccessControl(pipeSa);

最好只定义一个最小的用户集来访问管道服务器,以确保它的安全性。

我不允许评论,但我想指出,dvansanth的答案是正确的,这取决于操作系统语言。当操作系统语言不是英语时,"Everyone"组可能不存在。

我是这样解决的:

PipeSecurity pipeSa = new PipeSecurity();
pipeSa.SetAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null), 
                PipeAccessRights.ReadWrite, AccessControlType.Allow)); 
listeningPipe.SetAccessControl(pipeSa);

注意这是针对"Authenticated users"而不是"Everyone"