Как восстановить действующие права на ключ реестра? C ++ - PullRequest
0 голосов
/ 08 июля 2019

Я хотел бы получить действующие права для данного ключа реестра в качестве параметра.Я тестирую с существующим ключом реестра под Windows.Для этого я использую методы CreateFile, GetSecurityInfo и GetEffectiveRightsFromAclA.Я хотел бы знать, если это правильный метод, потому что у меня есть ошибка для метода CreateFile, который возвращает INVALID_HANDLE_VALUE.Более того, для метода GetEffectiveRightsFromAclA я не понимаю, какой параметр я должен указать в TRUSTEE_A?

LPCWSTR lpwRegistryKey = L"HKEY_CLASSES_ROOT\\.acc\\OpenWithProgids\\WMP11.AssocFile.ADTS";
HANDLE handleKey;
handleKey = CreateFile(lpwRegistryKey, GENERIC_READ, FILE_SHARED_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);

if(handleKey == INVALID_HANDLE_VALUE)
{
   //qDebug()<<"error";
}

//Here is an user SID
PSID pUserSid;
QString sSid("S-4-5-12");
BOOL resultSidConvert = ConvertStringSidToSidA(sSid.toStdString().c_str(), &pUserSid);
//Here success
if(resultSidConvert != 0)
{
    PACL pDacl;
    PSECURITY_DESCRIPTOR pSecurityDescriptor;

    DWORD dwResultSecurity = GetSecurityInfo(handleKey, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, nullptr, &pUserSid, &pDacl, nullptr, &pSecurityDescritptor);
    if(dwResultSecurity == ERROR_SUCCESS)
    {
       ACCESS_MASK pAccessMask;
       TRUSTEE_A pTrustee; //How should I initialize pTrustee?

       DWORD dwEffectiveRights = (GetEffectiveRightsFromAclA(pDacl, &pTrustee, &pAccessMask);
       if(dwEffectiveRights == ERROR_SUCCESS)
       {
           if((pAccessMask & DELETE) == DELETE)
           {
               qDebug()<<"Delete";
           }
           if((pAccessMask & GENERIC_READ) == GENERIC_READ)
           {
              qDebug()<<"READ";
           }
         //etc ..........
       }
    }
}

1 Ответ

0 голосов
/ 08 июля 2019

Раздел реестра - это не файл!

Не используйте CreateFile. Вместо этого используйте RegOpenKeyEx. Во-первых, вы должны запустить приложение от имени администратора.

Затем вы можете успешно открыть ключ. После этого взгляните на функцию RegGetKeySecurity.

...