Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Завтра :

День славянской письменности и культуры


Определение прав доступа пользователя к каталогу


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
Пол:Муж Lev
Новичок


Возраст: 44
Знак зодиака: Водолей
Зарегистрирован: 05.09.2006
Сообщения: 3
Откуда: Пермь
СообщениеЧт, 07-Сен-2006 8:38    Заголовок сообщения: Определение прав доступа пользователя к каталогу
Цитата

Возникла проблема с вызовом функции GetEffectiveRightsFromAcl. На ее вызове получаю от Windows сообщение: Access violation at address 77E833C3 in module RPCRT4.DLL. Read of address 88009C4D. Посоветуйте, кто что может.
Вот код, вызвавший ошибку:
-----------------------------------------------------------------------------------------------------
delphi:
  1.  
  2. function TSelectSetupDirFrm.DefUsrSetupAbilities: boolean;
  3. var DirAcl: _ACL; SecurityDescriptor: pointer;
  4.     UsrName: string; UsrSid: pointer; UsrTrustee: _TRUSTEE_A;
  5.     AccessRights: cardinal;
  6. begin
  7.   SecurityDescriptor := nil; Result := false;
  8.   if GetNamedSecurityInfo(PChar(FolderField.Text),
  9.          SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
  10.          nil, nil, @DirAcl, nil, SecurityDescriptor) = ERROR_SUCCESS then begin
  11.     UsrName := DefUsrName;
  12.     UsrSid := DefUsrSid(UsrName);
  13.     if UsrSid <> nil then begin
  14.       UsrTrustee.pMultipleTrustee := nil;
  15.       UsrTrustee.MultipleTrusteeOperation := NO_MULTIPLE_TRUSTEE;
  16.       UsrTrustee.TrusteeForm := TRUSTEE_IS_SID;
  17.       UsrTrustee.TrusteeType := TRUSTEE_IS_USER;
  18.       UsrTrustee.ptstrName := UsrSid;
  19.       //Ошибка выходит здесь
  20.       if GetEffectiveRightsFromAcl(DirAcl, UsrTrustee, AccessRights) = ERROR_SUCCESS then begin
  21.         Result := (AccessRights >= GENERIC_ALL);
  22.       end;
  23.       FreeMem(UsrSid);
  24.     end;
  25.   end;
  26.   if SecurityDescriptor <> nil then LocalFree(HLOCAL(SecurityDescriptor));
  27. end;
  28.  
В начало
Посмотреть профиль Отправить личное сообщение
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеПт, 08-Сен-2006 22:02 
Цитата

AccessRights - не cardinal, а pointer на 4-байтовое целое
_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Lev
Новичок


Возраст: 44
Знак зодиака: Водолей
Зарегистрирован: 05.09.2006
Сообщения: 3
Откуда: Пермь
СообщениеСб, 09-Сен-2006 0:04 
Цитата

DrPass писал(а):
AccessRights - не cardinal, а pointer на 4-байтовое целое

Это в API он pointer, а в Дельфи он cardinal, передаваемый в функцию через var. Я конечно попробовал, но получил по голове от компилятора.
Но дело уже не в этом. Помучав (или помучив) свой код еще некоторое время, я пришел к другой ошибке на том же самом вызове.

delphi:
  1.  
  2. function TSelectSetupDirFrm.DefUsrSetupAbilities: boolean;
  3. var
  4.   ...; AclPtr: PACL;
  5. begin
  6.   ...;
  7.   if AclPtr = nil then begin
  8.     ShowMessage('AclPtr = nil');
  9.     Result := false; Exit;
  10.   end;
  11.   if not IsValidAcl(AclPtr^) then begin
  12.     ShowMessage('ACL not valid');
  13.     Result := false; Exit;
  14.   end;
  15.   ...;
  16.   if GetEffectiveRightsFromAcl(AclPtr^, UsrTrustee, AccessRights) = ERROR_SUCCESS then begin
  17.     Result := (AccessRights >= GENERIC_ALL);
  18.   end
  19.   else Result := false;
  20.   ...;
  21. end;
  22.  


На этот раз она звучит так: "Access violation at address ... in module ntdll.dll. Read of address 00000000". Почитал я про подобные ошибки в интернете и тошно стало. Сообщают о ней все кому не лень, а решений 0. Неужели это конец?
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Lev
Новичок


Возраст: 44
Знак зодиака: Водолей
Зарегистрирован: 05.09.2006
Сообщения: 3
Откуда: Пермь
СообщениеВт, 12-Сен-2006 0:51 
Цитата

Проблему решил. Оказалось, что нельзя структуру TRUSTEE инициализировать напрямую. Вместо этого нужно пользоваться функциями BuildTrusteeWith...

Всем спасибо.
В начало
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100