我们正在使用命名管道实现进程间通信。 如果我对
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 包: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);