【发布时间】:2025-12-15 16:15:01
【问题描述】:
在将“写入”管道连接到正在运行的服务时,我遇到了与其他人相同的问题:UnauthorizedAccessException。我尝试了所有解决方案,但没有任何方法可以成功连接。
该场景是在系统托盘中运行一个低完整性 C#/WPF 应用程序,该应用程序使用命名管道从 Windows 服务获取通知,并可以告诉服务取消某些操作或等待更多数据(这就是它需要将管道写入服务)。从服务的管道读取工作正常,我正在使用两个管道对象(一个从服务到客户端,另一个从客户端到服务)。
该服务在域用户的帐户下运行,但无论在什么下运行,包括本地系统,管道都无法连接。
服务器管道是这样创建的:
PipeSecurity ps = new PipeSecurity();
// Production service runs under current user credentials.
ps.AddAccessRule(new PipeAccessRule(WindowsIdentity.GetCurrent().User, PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance, AccessControlType.Allow));
// Test service runs under local system credentials.
ps.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null), PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance, AccessControlType.Allow));
// Add world just for the hell of it, still won't work.
ps.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), PipeAccessRights.FullControl, AccessControlType.Allow));
this.readPipe = new NamedPipeServerStream(clientPipeName, PipeDirection.In);
this.writePipe = new NamedPipeServerStream(serverPipeName, PipeDirection.Out, 1, PipeTransmissionMode.Byte, PipeOptions.None, 1024, 1024, ps);
客户端管道是这样创建的:
this.readPipe = new NamedPipeClientStream(".", serverPipeName, PipeDirection.In);
this.writePipe = new NamedPipeClientStream(".", clientPipeName, PipeDirection.Out);
// This doesn't make a difference.
//this.writePipe = new NamedPipeClientStream(".", clientPipeName, PipeAccessRights.FullControl, PipeOptions.None, TokenImpersonationLevel.None, HandleInheritability.None);
【问题讨论】:
标签: c# named-pipes