Я думаю, GetEffectiveRightsFromAcl
должно вернуться, что у меня есть хотя бы пара прав в этой ситуации, но это дает мне 0.
Я использую SDDL для создания ACL с двумя записями, одна из которых предоставляет общие все права (GA
) на именованный SID, а другая - общие права чтения (GR
) для мирового sid. Затем я создаю второй экземпляр этого 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? Разве общие права не могут быть использованы в этой ситуации?