命名管道安全性和访问权限

Windows安全性使你能够控制对命名管道的访问。 有关安全性详细信息,请参阅 访问控制模型

调用 CreateNamedPipe函数时,可以指定命名管道的安全描述符。 安全描述符控制对命名管道的客户端和服务器端的访问。 如果指定 NULL, 则命名管道将获取默认安全描述符。 命名管道的默认安全描述符中的 ACL 向 LocalSystem 帐户、管理员和创建者所有者授予完全控制权。 它们还向 Everyone 组和匿名帐户的成员授予读取访问权限。

若要检索命名管道的安全描述符,请调用 GetSecurityInfo 函数。 若要更改命名管道的安全描述符,请调用 SetSecurityInfo 函数。

当线程调用 CreateNamedPipe 以打开现有命名管道的服务器端句柄时,系统会在返回句柄之前执行访问检查。 访问检查将线程的访问令牌和请求的访问权限与命名管道的安全描述符中的 DACL 进行比较。 除了请求的访问权限之外,DACL 还必须允许调用线程 FILE _ CREATE PIPE _ INSTANCE _ 访问命名管道。

同样,当客户端调用 CreateFileCallNamedPipe 函数连接到命名管道的客户端端时,系统会在授予客户端访问权限之前执行访问检查。

CreateNamedPipe函数返回的句柄始终具有 SYNCHRONIZE 访问权限。 它还具有泛型 _ READ 和/或 GENERIC _ WRITE,具体取决于管道的打开模式。 以下是每个打开模式的访问权限。

打开模式 访问权限
管道 _ 访问 _ 双工 (0x00000003) 文件 _ 泛型 _ 读取、文件 _ _ 通用写入和同步
管道 _ 访问 _ 入站 (0x00000001) 文件 _ 泛型 _ 读取和同步
管道 _ 访问 _ 出站 (0x00000002) FILE _ 泛型 _ 写入和同步

命名管道的 FILE GENERIC READ 访问权限合并了从管道读取数据、读取管道属性、读取扩展属性和读取 _ _ 管道的 DACL 权限。

命名管道的 FILE GENERIC WRITE 访问权限合并了将数据写入管道、向管道追加数据、写入管道属性、写入扩展属性和读取管道 _ _ DACL 的权利。 由于 FILE APPEND DATA 和 FILE CREATE PIPE INSTANCE 的定义相同,因此 _ _ FILE GENERIC WRITE _ _ _ _ _ 允许创建管道。 若要避免此问题,请使用单个权限,而不是使用 FILE _ GENERIC _ WRITE。

如果要读取或写入对象的 SACL,可以请求对命名管道对象的 _ ACCESS SYSTEM _ SECURITY 访问权限。 有关详细信息,请参阅 访问控制列表 (ACL) SACL 访问权限

若要防止其他终端服务会话上的远程用户访问命名管道,请对管道使用 DACL 上的登录 SID。 登录 SID 也用于运行方式登录;它是用于保护每会话对象命名空间的 SID。 有关详细信息,请参阅在C++ 中获取登录 SID。