Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как из D7 изменить права доступа к файлу/каталогу в Vista/XP? [D7, WinXP]


Непонятливый ©   (2007-03-05 04:20:00) 

Приветствую. У Vista интересная особенность: пользователь группы Users и с правами Админа (а это default после установки) все равно не имеет полного доступа к файлам, пока явно не изменить права на Full Control.

Вопрос: как изменить права доступа к каталогу/файлам из Дельфей? Хотя бы в XP, дальше сам накопаю.

Спасибо.


Eraser   (2007-03-05 19:37:00) [1]

> [0] Непонятливый   (05.03.07 04:20)

необходимо запускать программу с elevated правами, для этого можно поправить манифест, чтобы при запуске система сама запрашивала у юзера эти права, ну а далее см. [1], [2]. Хотя не понятно, какие файлы нужно изменять. Для изменения файлов в некоторых каталогах не нужно никаких дополнительных прав.


BiN   (2007-03-05 13:15:00) [2]

Также могу предложить пример редактирования ACL защищаемого объекта.

http://binary.front.ru/downloads/pma/pma.zip(35527 байт)


Rouse_   (2007-03-05 11:15:00) [3]

uses ..., Aclapi, AccCtrl;

function SetFileAccessRights(AFile, AUser: String; AMask: DWORD): Boolean;
var
 psd             : PSECURITY_DESCRIPTOR;
 dwSize, dwError : DWord;
 bDaclPresent    : Bool;
 bDaclDefaulted  : Bool;
 OldAcl          : PACL;
 NewAcl          : PACL;
 sd              : SECURITY_DESCRIPTOR;
 ea              : EXPLICIT_ACCESS;
begin
 Result := False;
 if WIN32Platform <> VER_PLATFORM_WIN32_NT then Exit;
 psd := nil;
 NewAcl := nil;
 bDaclDefaulted := True;
 if not GetFileSecurity(PChar(AFile), DACL_SECURITY_INFORMATION, Pointer(1),
          0, dwSize) and (GetLastError = ERROR_INSUFFICIENT_BUFFER)
 then
 try
   psd := HeapAlloc(GetProcessHeap, 8, dwSize);
   if psd <> nil then
   begin
     BuildExplicitAccessWithName(@ea, PChar(AUser), AMask,
       SET_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT{NO_INHERITANCE});
     Result := GetFileSecurity(PChar(AFile), DACL_SECURITY_INFORMATION, psd, dwSize, dwSize) and
       GetSecurityDescriptorDacl(psd, bDaclPresent, OldAcl, bDaclDefaulted) and
       (SetEntriesInAcl(1, @ea, OldAcl, NewAcl) = ERROR_SUCCESS) and
       InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION) and
       SetSecurityDescriptorDacl(@sd, True, NewAcl, False) and
       SetFileSecurity(PChar(AFile), DACL_SECURITY_INFORMATION, @sd);
   end;
 finally  
   if NewAcl <> nil then LocalFree(HLocal(NewAcl));
   if psd <> nil then HeapFree(GetProcessHeap, 0, psd);    
 end;
end;


Параметры: путь к объекту, имя пользователя, маска доступа, ее расчитываешь вот так: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthz/security/access_mask.asp


Наверх

Титульная страница Поиск, карта сайта Написать письмо