命名管道安全性和访问权限
Windows 安全性使你能够控制对命名管道的访问。 有关安全性的详细信息,请参阅 访问控制模型。
调用 CreateNamedPipe 函数时,可以为命名管道指定安全描述符。 安全描述符控制对命名管道客户端和服务器端的访问。 如果指定 NULL,则命名管道将获取默认的安全描述符。 命名管道的默认安全描述符中的 ACL 授予 LocalSystem 帐户、管理员和创建者所有者的完全控制权。 他们还向 Everyone 组的成员和匿名帐户授予读取访问权限。
若要检索命名管道的安全描述符,请调用 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对命名管道对象的访问权限。 有关详细信息,请参阅 访问控制列表 (ACL) 和 SACL 访问权限。
若要防止远程用户或其他终端服务会话上的用户访问命名管道,请使用管道 DACL 上的登录 SID。 登录 SID 也用于运行方式登录;它是用于保护每个会话对象命名空间的 SID。 有关详细信息,请参阅 获取 C++ 中的登录 SID。