Windows服务中NamedPipeClientStream连接服务端时遇访问拒绝异常
Named Pipes进程间通信权限异常问题
问题现象
使用Named Pipes实现进程间通信时,控制台客户端与控制台服务端通信正常;但将服务端迁移至Windows服务后,客户端控制台应用的NamedPipeClientStream尝试连接时抛出UnauthorizedAccessException,错误提示为Access to the path is denied.
两端初始化代码
客户端控制台应用
_clientStream = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut, PipeOptions.None, TokenImpersonationLevel.Impersonation);
服务端Windows服务
_server = new NamedPipeServerStream(pipeName, PipeDirection.InOut, maxNumberOfServerInstances: 1);
问题原因与解决方案
- 这是至少到.NET 5为止的已知问题:Windows服务端的命名管道需要配置额外安全权限,但.NET Core及更高版本未提供对应构造函数来直接设置;事后调用
NamedPipeServerStream.SetAccessControl添加权限无法生效。 - 曾有第三方NuGet包可解决该问题,但目前与.NET 8不兼容。
- 临时可行方案:改用.NET Framework实现Windows服务端。
内容的提问来源于stack exchange,提问作者Dabblernl
相关产品推荐
相关产品推荐

