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

C#高低权限进程间命名管道IPC通信的PipeSecurity配置问询

结论

仅需正确配置PipeSecurity即可解决提权/非提权进程跨权限等级的命名管道访问异常问题,无需额外调整系统设置或更换IPC方案。

异常原因

默认情况下,命名管道创建时会继承创建进程的安全描述符:

  • 提权运行的管理员进程属于高完整性级别,其创建的管道默认仅允许同级别及以上完整性的进程访问
  • 非提权运行的普通用户进程属于中完整性级别,直接访问高完整性进程创建的管道时,会被Windows安全层拦截,抛出System.UnauthorizedAccessException
  • 异常本质是管道安全描述符的DACL(自主访问控制列表)和SACL(系统访问控制列表)未对中完整性级别主体开放对应权限,并非命名管道本身不支持跨权限通信。
具体配置方法

对应你的场景,负责MFT查询的提权进程是管道服务端,非提权运行的WinForms主程序是管道客户端,两端配置如下:

提权服务端配置

服务端必须同时配置DACL访问规则和SACL完整性规则,缺一不可:

  1. 在DACL中为已认证用户开放管道必需的读写、同步权限
  2. 在SACL中将管道的可访问完整性级别设置为中,允许非提权进程访问

完整服务端初始化代码如下:

using System.IO.Pipes;
using System.Security.AccessControl;
using System.Security.Principal;

// 初始化管道安全配置
PipeSecurity pipeSecurity = new PipeSecurity();

// 配置DACL规则:给所有已认证用户开放读写、同步权限(不要开放完全控制,避免安全风险)
SecurityIdentifier authUserSid = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null);
pipeSecurity.AddAccessRule(new PipeAccessRule(
    authUserSid,
    PipeAccessRights.ReadWrite | PipeAccessRights.Synchronize,
    AccessControlType.Allow
));

// 配置SACL规则:设置管道允许中完整性级别(非提权进程)访问
// 中完整性级别SID固定为S-1-16-8192
SecurityIdentifier mediumIlSid = new SecurityIdentifier("S-1-16-8192");
pipeSecurity.AddAccessRule(new PipeAccessRule(
    mediumIlSid,
    PipeAccessRights.GenericRead | PipeAccessRights.GenericWrite,
    AccessControlType.Allow
));

// 创建命名管道服务端实例
using NamedPipeServerStream pipeServer = new NamedPipeServerStream(
    pipeName: "MftQueryPipe_YourAppUniqueId", // 替换为应用专属管道名,避免重名
    direction: PipeDirection.InOut,
    maxNumberOfServerInstances: 1,
    transmissionMode: PipeTransmissionMode.Message,
    options: PipeOptions.Asynchronous,
    inBufferSize: 8192,
    outBufferSize: 8192,
    pipeSecurity: pipeSecurity
);

// 等待客户端连接,后续正常执行读写逻辑即可
pipeServer.WaitForConnection();

注:提权运行的管理员进程默认持有配置SACL所需的SeSecurityPrivilege权限,无需额外调整权限。

非提权客户端配置

服务端配置正确的前提下,客户端不需要自定义PipeSecurity对象,使用默认参数即可正常连接,示例代码如下:

using System.IO.Pipes;

using NamedPipeClientStream pipeClient = new NamedPipeClientStream(
    serverName: ".",
    pipeName: "MftQueryPipe_YourAppUniqueId", // 和服务端管道名保持一致
    direction: PipeDirection.InOut,
    options: PipeOptions.Asynchronous
);

// 设置合理的连接超时,避免无限等待
pipeClient.Connect(3000);
// 连接成功后正常执行读写逻辑即可
安全注意事项
  • 不要给Everyone用户组开放完全控制权限,仅开放通信必需的最小权限,避免恶意进程通过管道注入恶意数据
  • 管道名称建议加入应用专属GUID后缀,避免和其他软件的命名管道重名冲突
  • 连接建立后可增加轻量校验逻辑,比如校验连接方的进程路径、签名信息,进一步降低被恶意利用的风险
  • 如果配置后仍出现访问拒绝,优先检查是否有终端安全软件拦截跨进程命名管道通信

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:57:08