【问题标题】:Remove/Modify an inherited ACE in an ACL (Windows)删除/修改 ACL 中的继承 ACE (Windows)
【发布时间】:2012-04-28 07:07:28
【问题描述】:

我正在尝试修改目录(及其子目录)上的现有 ACL,以删除内置用户组的写入权限。该目录从其父目录继承此特定权限。我尝试使用 AtlSetDacl() 设置新的 ACL,但这并没有清除继承的写入权限。片段:

ATL::CDacl dacl;
ATL::AtlGetDacl(directoryName.c_str(), SE_FILE_OBJECT, &dacl);
UINT aceCount = dacl.GetAceCount();
ATL::CDacl newDacl;
for (UINT i = 0; i < aceCount; ++i)
{
   ATL::CSid sid;
   ACCESS_MASK mask = 0;
   BYTE flags = 0;
   dacl.GetAclEntry(i,
                    &sid,
                    &mask,
                    (BYTE*) 0,
                    &flags);
   if (sid != Sids::Users())
       newDacl.AddAllowedAce(sid, mask, flags);
}
newDacl.AddAllowedAce(Sids::Users(),FILE_LIST_DIRECTORY | FILE_READ_EA | FILE_EXECUTE | FILE_READ_ATTRIBUTES, CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE);
AtlSetDacl(directoryName.c_str(), SE_FILE_OBJECT, newDacl);

我还尝试过 SetNamedSecurityInfo() 和相关 API 来擦除现有 ACL 并创建一个新 ACL,但这里也没有运气。看起来这应该不是那么难。使用 cacls.exe 这是小菜一碟(不幸的是,这不是我的选择)。关于如何做到这一点的任何想法?

【问题讨论】:

  • 这是实际代码吗?因为您使用省略的 ACE 构造 newDacl,然后将(旧)dacl 设置回目录中。
  • 感谢您指出这一点,戴夫。正在使用太多版本并粘贴了错误的版本。修复了代码块。这是不符合我预期的代码。

标签: c++ windows acl


【解决方案1】:

要删除继承的 ACE,请调用 SetNamedSecurityInfo 并为 SecurityInfo 参数传递 DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION

PROTECTED_DACL_SECURITY_INFORMATION 标志防止来自父级的可继承 ACE 添加到您指定的 ACL。

如果您不需要复制其他继承的权限,而只需指定要使用的特定 ACL,那会更简单。如果您确实需要复制其他继承的权限,则需要在现有代码中保留 read-compare-add 循环,但您还应该清除 INHERITED_ACE 标志,因为这些现在是显式权限。

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 2012-02-21
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多