Проблема восстановления действующих прав на общую папку - PullRequest
0 голосов
/ 05 мая 2019

Я хочу восстановить действующие права на общую папку. Для этого я использовал методы CreateFile, GetSecurityInfo и GetEffectiveRightsFromAclA. Проблема в том, что когда я проверяю права, он не работает, пока я устанавливаю SID администратора. Это происходит из-за плохой реализации моего кода? Я указываю, что у меня есть права на файл.

    //stringName is the file path
    HANDLE file = CreateFile(stringName.c_str(), GENERIC_READ, 
    FILE_SHARE_READ, 
    nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
    PSID pSid;
    //The SID is that of the administrator 
    ConvertStringSidToSidA(stringSid.c_str(), &pSid);

    PACL ppDacl;
    PSECURITY_DESCRIPTOR ppSecurityDescriptor;
    GetSecurityInfo(file, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nullptr, 
    &pSid, &ppDacl, nullptr, &ppSecurityDescriptor);

    ACCESS_MASK pAccesMask;
    TRUSTEE_A pTrustee;
    GetEffectiveRightsFromAclA(ppDacl, &pTrustee, &pAccesMask);
    //here conditions are not respected
    if((pAccesMask & GENERIC_READ) == GENERIC_READ)
    {
        std::cout<<"ok"<<std::endl;
    }
    if((pAccesMask & GENERIC_WRITE) == GENERIC_WRITE)
    {
        std::cout<<"ok"<<std::endl;
    }
    if((pAccesMask & GENERIC_EXECUTE) == GENERIC_EXECUTE)
    {
        std::cout<<"ok"<<std::endl;
    }
    if((pAccesMask & GENERIC_ALL) == GENERIC_ALL)
    {
        std::cout<<"ok"<<std::endl;
    }

1 Ответ

1 голос
/ 06 мая 2019

Перед использованием значения pAccesMask убедитесь, что функция GetEffectiveRightsFromAclA возвращает ERROR_SUCCESS.

И поскольку файловый объект Windows отображает бит GENERIC_READ в стандартные права доступа READ_CONTROL и SYNCHRONIZE . Поэтому измените логику проверки условий для GENERIC_READ следующим образом:

if ((pAccesMask & READ_CONTROL) == READ_CONTROL && (pAccesMask & SYNCHRONIZE) == SYNCHRONIZE) //GENERIC_READ
{
    std::cout << "GENERIC_READ" << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...