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

标签 c# windows permissions windows-services named-pipes

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

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

最好只定义最少的一组用户来访问管道服务器以确保其安全。

关于c# - 命名管道客户端无法连接到作为网络服务运行的服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23852558/

相关文章:

c# - 反射仅在 Blazor-State-Management 中的第一次调用时成功

c# - 我应该关注 linq 查询中的 "access to modified closure"吗?

python - pip install -U setuptools 使 windows 10 失败

android - 我可以在字符串 res 中包含权限名称吗

PHP上传的文件权限不正确

macos - chmod 无法更改权限

c# - 找出值类似于列表中的任何值

c# - 在 .NET 中释放 COM 对象的 "ownership"

windows - "TCHAR cFileName[MAX_PATH];"- MSDN 库中的错误?

.net - 以最高权限运行计划任务