Коллеги, прошу помощи.
Имею следующее:
открываю ключ реестра
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
ГДЕ Я ТУПЛЮ????
вы проверяете права доступа к ключу реестра для вашего токена, а не права доступа к нему, с которыми был открыт хандл ATestKey. это совершенно разные вещи. если интересуют именно права хандла — то
ZwQueryObject с классом ObjectBasicInformation и смотреть на поле
GrantedAccess
Здравствуйте, anonymous185, Вы писали:
A>вы проверяете права доступа к ключу реестра для вашего токена, а не права доступа к нему, с которыми был открыт хандл ATestKey. это совершенно разные вещи. если интересуют именно права хандла — то ZwQueryObject с классом ObjectBasicInformation и смотреть на поле GrantedAccess
спасибо большое anonymous185!!!
выходит я все это время тупо проверял токен, вместо того чтобы работать с хендлом
ушел посыпать голову пеплом
еще раз благодарю