我正在尝试以“正确”的方式在命名管道上设置权限 .
似乎设置访问权限的最简单正确方法是通过ACE字符串,如下所示:
sa.nLength = sizeof(sa);
sa.bInheritHandle = FALSE;
if (ConvertStringSecurityDescriptorToSecurityDescriptor(aceStr,
SDDL_REVISION_1,
&(sa.lpSecurityDescriptor),
NULL))
{
pipe = CreateNamedPipe(..., &sa);
}
我希望管道拥有者拥有完全控制权,而其他所有人只能拥有读写权限 . 我还希望管道具有较低的完整性级别,以便低完整性级别的客户端可以连接 .
在过去,我总是只使用NULL DACL,因为它很容易,但微软明确表示这不是一个好主意,因为它允许任何客户端获得管道的完全所有权 .
我知道字符串的SADL部分需要
S:(ML;;NW;;;LW)
这使管道的完整性水平低 .
DACL部分需要包括
D:(A;;FRFW;;;WD)
它赋予'Everyone'读写权限 . 我需要在其末尾添加另一个ACE字符串,以便为所有者设置完全控制权 . 但我找不到一个代码,它在Windows的最终位置用当前进程的SID替换它 .
S:(ML;;NW;;;LW)D:(A;;FRFW;;;WD)(A;;FA;;;<current process?>)
我找到了一些获取当前进程的SID的代码,但它涉及大约4或5个API调用的连续性 . 这应该是一项微不足道的任务,所以我确信这不是做我想要的正确方法 .
最后,我是否在正确的轨道上?为什么这么复杂?
两个补充问题:传递给CreateNamedPipe()的安全属性结构必须与管道具有相同的生命周期,还是可以在调用返回后立即删除它?您可以为多个管道实例使用相同的结构,还是CreateNamedPipe()修改它?
2 回答
似乎像
CO
(creator owner)是最接近的匹配 .看来我的问题是基于我的困惑和误解 .
文件的所有者始终有权更改文件的权限 .
所以我不需要明确地为所有者设置权限 . 我需要的ACE字符串是:
(我想为所有者明确设置权限的原因是我认为如果我不这样做,那么所有者将失去所有权 . )