当 NamedPipeClientStream 尝试连接到 Windows 服务中的 NamedPipeServerStream 时,“访问路径被拒绝”

问题描述 投票:0回答:1

我们正在使用命名管道实现进程间通信。 如果我对

NamedPipeClientStream
NamedPipeServerStream
使用控制台应用程序,它的工作效果会非常好。但是,当我将服务器流移动到 Windows 服务时,当
UnauthorizedAccessException
尝试连接时,客户端控制台应用程序会抛出
NamedPipedClientStream
(“对路径的访问被拒绝。”)。

初始化通信两端的代码:

在客户端控制台应用程序上:

  _clientStream = new NamedPipeClientStream(".", pipeName,
                                    PipeDirection.InOut, PipeOptions.None,
                                    TokenImpersonationLevel.Impersonation);

在服务器Windows服务上:

 _server = new NamedPipeServerStream(pipeName, 
                                    PipeDirection.InOut, maxNumberOfServerInstances: 1);

编辑: 这似乎是至少 Net 5 的一个已知问题。问题是您需要额外的安全权限服务器(Windows 服务)端,必须将其添加到构造函数中。但是Net.Core及之后的版本不提供这样的构造函数!稍后通过调用添加权限

namedPipedServerStream.SetAccessControl
似乎不起作用。 一位开发人员的 Nuget 包据说可以解决这个问题,但目前似乎与 Net 8 不兼容。 解决方案:在Net Framework中实现...

问题描述

Nuget包解决问题

windows-services named-pipes
1个回答
0
投票

我解决了: 您需要 Nuget 包:NamedPipeServerStream.NetFrameworkVersion 这样使用它:

using System.IO.Pipes;

var pipeSecurity = new PipeSecurity();
pipeSecurity.AddAccessRule(new PipeAccessRule(new 
    SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null), 
    PipeAccessRights.ReadWrite, AccessControlType.Allow));

using var serverStream = NamedPipeServerStreamConstructors.New(pipeName, 
    PipeDirection.InOut, 1, PipeTransmissionMode.Byte, 
    PipeOptions.Asynchronous | PipeOptions.WriteThrough, 0, 0, 
    pipeSecurity);
© www.soinside.com 2019 - 2024. All rights reserved.