为什么在这种情况下GetEffectiveRightsFromAcl不返回任何权限?

时间:2019-04-07 21:42:23

标签: c++ winapi

在这种情况下,我认为GetEffectiveRightsFromAcl应该返回我至少拥有一些权利,但它给了我0。

我使用SDDL创建一个具有两个条目的ACL,一个条目将命名的SID授予通用所有权限(GA),另一个授予world sid的授予通用读取权限(GR)。然后,我创建该SID的第二个实例,将其包装在受托人中,然后将其传递到GetEffectiveRightsFromAcl中。我希望这将赋予我通用的所有权利,并可能具有其他一些继承的权利。但是,下面的代码显示0(Visual Studio Community 15.9.7)。

int main() {
    PSECURITY_DESCRIPTOR sd;
    PSID sid;
    TRUSTEE_A trustee;
    PACL dacl;

    if (!ConvertStringSecurityDescriptorToSecurityDescriptorA(
        "D:(A;;GA;;;S-1-5-1-2-3)(A;;GR;;;WD)",
        SDDL_REVISION_1,
        &sd,
        nullptr
    )){
        // Error handling omitted
    }

    if (!ConvertStringSidToSidA("S-1-5-1-2-3", &sid)) {
        // Error handling omitted
    }

    BuildTrusteeWithSidA(&trustee, sid);

    BOOL present;
    BOOL defaulted;
    if (!GetSecurityDescriptorDacl(sd, &present, &dacl, &defaulted)) {
        // Error handling omitted
    }

    ACCESS_MASK access;
    if (GetEffectiveRightsFromAclA(dacl, &trustee, &access) != ERROR_SUCCESS) {
        // Error handling omitted
    }

    std::cout << access << std::endl;

    LocalFree(sid);
    LocalFree(sd);
}

ACL格式是否有问题?普通权利在这种情况下不可用吗?

1 个答案:

答案 0 :(得分:0)

GetEffectiveRightsFromAcl函数旨在搜索ACL并返回访问掩码,该访问掩码指示DACL允许对受托者的访问。听起来很方便!这样的功能可能会消除我们在添加自己的DACL之前在ACEs中搜索ACEs的需要。 GetEffectiveRightsFromAcl却尝试做太多事情,因此最终几乎一无所用。

GetEffectiveRightsFromAcl根据允许的匹配访问权限ACEs的组合找出允许的访问,然后减去拒绝访问的匹配ACEs的组合。这意味着GetEffectiveRightsFromAcl可以返回一组访问权限,表明ACL没有授予我想要的我的受托人访问权限。

更有用的功能SetEntriesInAclGetExplicitEntriesFromAcl旨在解除您为ACEsACLs分配内存的责任,同时仍然允许您处理{ {1}}直接。这些功能的目标很高,但是这些功能在错误和性能问题方面有着悠久的历史。其中一些问题已得到解决,但是如果您选择在项目中使用这些功能,则必须彻底测试使用它们的代码,这一点很重要。

您还可以参考以下信息: https://flylib.com/books/en/4.420.1.83/1/