You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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个参数的构造函数


解决方法

  1. 确认.NET版本差异:带PipeSecurity参数的8参构造函数仅在.NET Framework及.NET Core 3.0+/.NET 5+中可用。如果你用的是更早的.NET Core版本(比如2.x),确实没有这个构造函数。
  2. 替代方案:创建后设置权限:你当前用的SetAccessControl方法是可行的,但要注意必须在管道连接任何客户端之前调用。如果管道已经有客户端连接,调用SetAccessControl会导致权限不生效甚至报错。
  3. 修正代码顺序:调整代码逻辑,先配置好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();

// 后续管道操作...
  1. 检查库引用:确保你引用的是System.IO.Pipes程序集,这个在所有.NET版本中都是核心库,不需要额外安装NuGet包。

内容的提问来源于stack exchange,提问作者Furbs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 23:12:17