C#修改命名管道访问权限遇授权异常及构造器参数问题
命名管道权限配置问题
我在给命名管道添加安全权限时碰到了未授权访问异常。我知道得在创建管道时就定义权限,或者至少添加权限来修改管道,但不知道具体怎么操作。网上的示例参数太多,我的编译器显示NamedPipeServerStream最多只有7个参数,没有安全选项,微软文档也确认了这一点。
我的代码如下:
using System.IO.Pipes; NamedPipeServerStream pipeServer; pipeServer = new NamedPipeServerStream("PipeName", PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); PipeSecurity clientPipeSecurity = new PipeSecurity(); //PipeAccessRule clientAccessRule = new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), PipeAccessRights.ReadWrite, AccessControlType.Allow); //clientPipeSecurity.AddAccessRule(clientAccessRule); PipeAccessRule clientAccessRule = new PipeAccessRule("Domain Users", PipeAccessRights.ReadWrite, AccessControlType.Allow); clientPipeSecurity.AddAccessRule(clientAccessRule); pipeServer.SetAccessControl(clientPipeSecurity);
我是不是引用了错误的库?为什么没法像其他帖子里的示例那样编译?我猜那些示例太老了,.NET已经移除了那个选项。尝试下面这段代码时:
pipeServer = new NamedPipeServerStream("DAQUpdater", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 0x4000, 0x400, pipeSecurity);
编译器报错:
'NamedPipeServerStream' 不包含接受8个参数的构造函数
解决方法
- 确认.NET版本差异:带
PipeSecurity参数的8参构造函数仅在.NET Framework及.NET Core 3.0+/.NET 5+中可用。如果你用的是更早的.NET Core版本(比如2.x),确实没有这个构造函数。 - 替代方案:创建后设置权限:你当前用的
SetAccessControl方法是可行的,但要注意必须在管道连接任何客户端之前调用。如果管道已经有客户端连接,调用SetAccessControl会导致权限不生效甚至报错。 - 修正代码顺序:调整代码逻辑,先配置好
PipeSecurity,再调用SetAccessControl,确保在WaitForConnection()之前完成权限设置:
using System.IO.Pipes; using System.Security.AccessControl; using System.Security.Principal; NamedPipeServerStream pipeServer = new NamedPipeServerStream( "PipeName", PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); // 配置管道权限 PipeSecurity pipeSecurity = new PipeSecurity(); // 允许域用户读写 PipeAccessRule accessRule = new PipeAccessRule( "Domain Users", PipeAccessRights.ReadWrite, AccessControlType.Allow); pipeSecurity.AddAccessRule(accessRule); // 在等待连接前设置权限 pipeServer.SetAccessControl(pipeSecurity); // 等待客户端连接 pipeServer.WaitForConnection(); // 后续管道操作...
- 检查库引用:确保你引用的是
System.IO.Pipes程序集,这个在所有.NET版本中都是核心库,不需要额外安装NuGet包。
内容的提问来源于stack exchange,提问作者Furbs
相关产品推荐
相关产品推荐

