指定当前用户的ACE字符串

时间:2011-10-21 16:04:01

标签: windows security winapi

我正在尝试以正确的方式设置命名管道的权限。

设置访问权限的最简单正确方法似乎是通过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 个答案:

答案 0 :(得分:0)

似乎COcreator owner)是最接近的匹配。

答案 1 :(得分:0)

看来我的问题是基于我的困惑和误解。

文件始终的所有者有权更改文件的权限。

所以我不需要显式设置所有者的权限。我需要的ACE字符串是:

S:(ML;;NW;;;LW)D:(A;;FRFW;;;WD)

(我之所以要为所有者明确设置权限的原因是我认为如果我不这样做,那么所有者就会失去所有权。)