Windows 安全性使你能够控制对命名管道的访问。 有关安全性的详细信息,请参阅 Access-Control 模型。
调用 CreateNamedPipe 函数时,可以为命名管道指定 安全描述符。 安全描述符控制对命名管道客户端和服务器端的访问。 如果指定 NULL,则命名管道将获取默认的安全描述符。 命名管道的默认安全描述符中的 ACL 向 LocalSystem 帐户、管理员和创建者所有者授予完全控制权。 他们还授予“每个人”组成员和匿名帐户的读取访问权限。
若要检索命名管道的安全描述符,请调用 GetSecurityInfo 函数。 若要更改命名管道的安全描述符,请调用 SetSecurityInfo 函数。
当线程调用 CreateNamedPipe 打开现有命名管道的服务器端的句柄时,系统会在返回句柄之前执行访问检查。 访问检查将线程的访问令牌和请求 访问权限 与命名管道的安全描述符中的 DACL 进行比较。 除了请求的访问权限之外,DACL 还必须允许调用线程FILE_CREATE_PIPE_INSTANCE对命名管道的访问。
同样,当客户端调用 CreateFile 或 CallNamedPipe 函数以连接到命名管道的客户端端时,系统会在授予对客户端的访问权限之前执行访问检查。
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访问权限。 有关详细信息,请参阅 Access-Control 列表(ACL) 和 SACL 访问权限。
若要防止其他终端服务会话上的远程用户或用户访问命名管道,请使用管道的 DACL 上的登录 SID。 登录 SID 也用于运行方式登录;它是用于保护每个会话对象命名空间的 SID。 有关详细信息,请参阅 获取 C++中的登录 SID。