首页 文章

指定当前用户的ACE字符串

提问于
浏览
1

我正在尝试以“正确”的方式在命名管道上设置权限 .

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

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

  • 0

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

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

    所以我不需要明确地为所有者设置权限 . 我需要的ACE字符串是:

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

    (我想为所有者明确设置权限的原因是我认为如果我不这样做,那么所有者将失去所有权 . )

相关问题