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

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

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

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

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

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

CreateNamedPipe 函数返回的句柄始终具有 SYNCHRONIZE 访问权限。 它还具有GENERIC_READ、GENERIC_WRITE或两者,具体取决于管道的打开模式。 以下是每个打开模式的访问权限。

打开模式 访问权限
PIPE_ACCESS_DUPLEX (0x00000003) FILE_GENERIC_READ、FILE_GENERIC_WRITE 和 SYNCHRONIZE
PIPE_ACCESS_INBOUND (0x00000001) FILE_GENERIC_READ和 SYNCHRONIZE
PIPE_ACCESS_OUTBOUND (0x00000002) FILE_GENERIC_WRITE和 SYNCHRONIZE

 

命名管道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