Как определить права доступа для открытого ключа реестра
От: dummii_02  
Дата: 13.11.13 17:22
Оценка:
Коллеги, прошу помощи.
Имею следующее:
открываю ключ реестра


HKEY TestKey = nullptr;
ErrCode = ::RegOpenKeyEx( HKEY_CURRENT_USER
                         , L"SOFTWARE\\XYZ
                         , 0
                         , KEY_READ
                         , &TestKey );
if (ERROR_SUCCESS == ErrCode) {
,.,....
}



затем пытаюсь при помощи след. функции проверить, могу ли я писать в ключ


bool        hasAnyWriteRights2( HKEY        ATestKey
                , DWORD&    oAvailableRights )
{
    oAvailableRights    = 0;
    bool    RetValue    = false;
    LPVOID    Buf        = nullptr;
    DWORD    BufSizeB    = 0;
    SECURITY_INFORMATION    SecInfo    = DACL_SECURITY_INFORMATION
                    | GROUP_SECURITY_INFORMATION
                    | OWNER_SECURITY_INFORMATION;

    LONG ErrCode = ::RegGetKeySecurity( ATestKey
                    , SecInfo
                    , Buf
                    , &BufSizeB );

    if (ERROR_INSUFFICIENT_BUFFER == ErrCode) {
        Buf = new(std::nothrow) BYTE[BufSizeB];
        
        if (Buf) {
            assert( Buf );

            HANDLE        ThreadToken    = 0;
            PRIVILEGE_SET    PrivilegeSet    = {0};
            DWORD        dwPrivSetSize    = sizeof( PRIVILEGE_SET );
            GENERIC_MAPPING    RegMap        = { KEY_READ                                 
                                                            , KEY_WRITE
                                , KEY_EXECUTE
                                , KEY_ALL_ACCESS };
            DWORD        GrantedAccess    = 0;
            BOOL        Status        = FALSE;

            ErrCode = ::RegGetKeySecurity( ATestKey
                        , SecInfo
                        , Buf
                        , &BufSizeB );

            if (ERROR_SUCCESS == ErrCode) {
                ::ImpersonateSelf( SecurityImpersonation );
                BOOL ErrCodeB = ::OpenThreadToken( ::GetCurrentThread()
                                , TOKEN_QUERY | TOKEN_IMPERSONATE
                                , TRUE
                                , &ThreadToken );
                if (FALSE != ErrCodeB) {
                    DWORD dwDesiredAccess = KEY_WRITE;
                    MapGenericMask(&dwDesiredAccess, &RegMap);

                    ErrCodeB = ::AccessCheck( (PSECURITY_DESCRIPTOR) Buf
                                , ThreadToken
                                , dwDesiredAccess 
                                    , &RegMap
                                , &PrivilegeSet
                                , &dwPrivSetSize
                                , &GrantedAccess
                                , &Status );

                    RetValue = RetValue || (FALSE != ErrCodeB);
                    if (FALSE != Status) {
                        oAvailableRights = GrantedAccess;
                    }

                    ::CloseHandle( ThreadToken );
                }
                ::RevertToSelf();
            }
            delete[] Buf;
        }
    }
    return RetValue;
}



в результате в GrantedAccess получаю KEY_SET_VALUE и KEY_CREATE_SUB_KEY??????????
Хотя ключ был открыт с KEY_READ
ГДЕ Я ТУПЛЮ????
Re: Как определить права доступа для открытого ключа реестра
От: anonymous185  
Дата: 13.11.13 18:21
Оценка: 12 (1)
вы проверяете права доступа к ключу реестра для вашего токена, а не права доступа к нему, с которыми был открыт хандл ATestKey. это совершенно разные вещи. если интересуют именно права хандла — то ZwQueryObject с классом ObjectBasicInformation и смотреть на поле GrantedAccess
Re[2]: Как определить права доступа для открытого ключа реестра
От: dummii_02  
Дата: 14.11.13 08:29
Оценка:
Здравствуйте, anonymous185, Вы писали:

A>вы проверяете права доступа к ключу реестра для вашего токена, а не права доступа к нему, с которыми был открыт хандл ATestKey. это совершенно разные вещи. если интересуют именно права хандла — то ZwQueryObject с классом ObjectBasicInformation и смотреть на поле GrantedAccess


спасибо большое anonymous185!!!
выходит я все это время тупо проверял токен, вместо того чтобы работать с хендлом
ушел посыпать голову пеплом

еще раз благодарю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.