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

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


копирование с правами доступа


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


Возраст: 32
Знак зодиака: Рыбы
Зарегистрирован: 13.06.2007
Сообщения: 3

СообщениеСр, 13-Июн-2007 12:19    Заголовок сообщения: копирование с правами доступа
Цитата

коллеги, не завалялось ли у кого процедурки копирования каталогов (с подкаталогами и файлами, разумеется) с копированием уровней доступа, как, например, умеют делать некоторые файловые менеджеры?
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж NikotiN
Розовый мамонт


Возраст: 26
Знак зодиака: Овен
Зарегистрирован: 18.03.2005
Сообщения: 2137

СообщениеСр, 13-Июн-2007 17:13 
Цитата

хм, а через Win32Api разве не работает? мне казалось, что так можно даже потоки дополнительные копировать...
_________________
Сила дурака в том, что умный перед ним бессилен.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеЧт, 14-Июн-2007 9:10 
Цитата

Думается мне, надо юзать связку GetFileSecurity/SetFileSecurity.
_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж dennist
Новичок


Возраст: 32
Знак зодиака: Рыбы
Зарегистрирован: 13.06.2007
Сообщения: 3

СообщениеЧт, 14-Июн-2007 10:41 
Цитата

кто-нибудь может кинуть пример копирования настроек безопасности через GetFileSecurity/SetFileSecurity? я облазил весь инет, ничего толкового не нашел

Добавлено спустя 58 минут 46 секунд:

в общем подумал я и написал следующий код:

delphi:
  1. function WindowsCopyFileSec(FromDir, ToDir : string) : boolean;
  2. var
  3.   PSecDesc   : PSecurityDescriptor;
  4.   SizeNeeded : DWORD;
  5.  
  6.   procedure CopyAR(FromDir, ToDir : string; ReqInfo: Cardinal);
  7.   begin
  8.     GetFileSecurity(PChar(FromDir), ReqInfo, PSecDesc, 1024, SizeNeeded);
  9.     SetFileSecurity(PChar(ToDir), ReqInfo, PSecDesc);
  10.   end;
  11.  
  12.   procedure CopyA(FromDir, ToDir: String);
  13.   var
  14.     Found : integer;
  15.     SRec  : TSearchRec;
  16.     s     : String;
  17.     AFrom,
  18.     ATo   : String;
  19.   begin
  20.     if not DirectoryExists(ToDir) then begin
  21.       MkDir(ToDir);
  22.       CopyAR(FromDir, ToDir, DACL_SECURITY_INFORMATION);
  23.     end;
  24.  
  25.     if FindFirst(FromDir + '\*.*', faAnyFile, SRec) = 0 then begin
  26.       repeat
  27.  
  28.         if (SRec.name <> '.') and (SRec.name <> '..') then begin
  29.             AFrom := FromDir + '\' + SRec.Name;
  30.             ATo := ToDir + '\' + SRec.Name;
  31.  
  32.             if (SRec.Attr and faDirectory) = faDirectory
  33.               then CopyA(AFrom, ATo)
  34.               else begin
  35.                 CopyFile(PChar(AFrom), PChar(ATo), False);
  36.                 CopyAR(AFrom, ATo, DACL_SECURITY_INFORMATION);
  37.               end;
  38.         end;
  39.  
  40.       until FindNext(SRec) <> 0;
  41.       FindClose(SRec);
  42.     end;
  43.   end;
  44.  
  45. begin
  46.   GetMem(PSecDesc, 1024);
  47.   try
  48.     CopyA(FromDir, ToDir);
  49.   finally
  50.     FreeMem(PSecDesc);
  51.   end;
  52. end;


похоже, работает, всем спасибо Улыбка

_________________
если всех людей земли организовать умело...
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеЧт, 14-Июн-2007 13:33 
Цитата

как оказалось, я ошибался и GetFileSecurity/SetFileSecurity тут ни при чем.
потому с твоим решением не могу согласиться.

пару часов ковыряния в win32 sdk привело меня к написанию вот такой вот функции (см. ниже)
как оказалось, все совсем иначе, но так же просто.

delphi:
  1. uses
  2.  Windows, AclAPI, AccCtrl;
  3.  
  4. ...
  5.  
  6. function CopyAccessSecurity(SrcFile, DestFile: string): DWORD;
  7. var
  8.   pDACL: PACL;
  9.   pSD: PSECURITY_DESCRIPTOR;
  10. begin
  11.   result := GetNamedSecurityInfo(Pchar(SrcFile), SE_FILE_OBJECT,
  12.     DACL_SECURITY_INFORMATION, nil, nil, PACL(@pDACL), nil, pSD);
  13.  
  14.   if result <> ERROR_SUCCESS then exit;
  15.  
  16.   result := SetNamedSecurityInfo(Pchar(DestFile), SE_FILE_OBJECT,
  17.     DACL_SECURITY_INFORMATION, nil, nil, pDACL, nil);
  18. end;


таким образом, копирование файла вместе с правами доступа выглядит так:
delphi:
  1.   CopyFile(FileSrc, FileDest, true);
  2.   CopyAccessSecurity(FileSrc, FileDest);

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

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