在这种情况下,我认为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格式是否有问题?普通权利在这种情况下不可用吗?
答案 0 :(得分:0)
GetEffectiveRightsFromAcl
函数旨在搜索ACL
并返回访问掩码,该访问掩码指示DACL
允许对受托者的访问。听起来很方便!这样的功能可能会消除我们在添加自己的DACL
之前在ACEs
中搜索ACEs
的需要。 GetEffectiveRightsFromAcl
却尝试做太多事情,因此最终几乎一无所用。
GetEffectiveRightsFromAcl
根据允许的匹配访问权限ACEs
的组合找出允许的访问,然后减去拒绝访问的匹配ACEs
的组合。这意味着GetEffectiveRightsFromAcl
可以返回一组访问权限,表明ACL
没有授予我想要的我的受托人访问权限。
更有用的功能SetEntriesInAcl
和GetExplicitEntriesFromAcl
旨在解除您为ACEs
和ACLs
分配内存的责任,同时仍然允许您处理{ {1}}直接。这些功能的目标很高,但是这些功能在错误和性能问题方面有着悠久的历史。其中一些问题已得到解决,但是如果您选择在项目中使用这些功能,则必须彻底测试使用它们的代码,这一点很重要。
您还可以参考以下信息: https://flylib.com/books/en/4.420.1.83/1/