Почему GetEffectiveRightsFromAcl не возвращает никаких прав в этом случае? - PullRequest
0 голосов
/ 08 апреля 2019

Я думаю, 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? Разве общие права не могут быть использованы в этой ситуации?

1 Ответ

0 голосов
/ 09 апреля 2019

Функция GetEffectiveRightsFromAcl предназначена для поиска ACL и возврата маски доступа, которая указывает доступ, предоставленный доверенному лицу DACL. Звучит очень удобно! Такая функция потенциально может избавить нас от необходимости искать DACL для ACEs перед добавлением нашего ACEs. GetEffectiveRightsFromAcl, однако, пытается сделать слишком много, и в итоге почти ничего не делает.

GetEffectiveRightsFromAcl вычисляет разрешенный доступ на основе компоновки совпадающего разрешенного доступа ACEs, а затем вычитает совокупность совпадающего запрещенного доступа ACEs. Это означает, что GetEffectiveRightsFromAcl может возвращать набор прав доступа, указывая, что ACL не присуждает доступ, который я хочу для своего опекуна.

Более полезные функции SetEntriesInAcl и GetExplicitEntriesFromAcl предназначены для того, чтобы снять с вас ответственность за выделение памяти для ACEs и ACLs, и в то же время позволяют вам иметь дело с ACL напрямую. Цель этих функций велика, но у этих функций грязная история ошибок и проблем с производительностью. Некоторые из этих проблем были устранены, но если вы решите использовать эти функции в своих проектах, важно тщательно протестировать код, который их использует.

Вы также можете обратиться к следующей информации: https://flylib.com/books/en/4.420.1.83/1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...