| Автор
| Сообщение |
 dennist
Новичок

Возраст: 32
Знак зодиака: 
Зарегистрирован: 13.06.2007
Сообщения: 3
|
|
|
Цитата |
|
| коллеги, не завалялось ли у кого процедурки копирования каталогов (с подкаталогами и файлами, разумеется) с копированием уровней доступа, как, например, умеют делать некоторые файловые менеджеры? |
|
| В начало |
|
 |
|
|
 |
 NikotiN
Розовый мамонт

Возраст: 26
Знак зодиака: 
Зарегистрирован: 18.03.2005
Сообщения: 2137
|
|
|
Цитата |
|
хм, а через Win32Api разве не работает? мне казалось, что так можно даже потоки дополнительные копировать... _________________ Сила дурака в том, что умный перед ним бессилен. |
|
| В начало |
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
Думается мне, надо юзать связку GetFileSecurity/SetFileSecurity. _________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
 dennist
Новичок

Возраст: 32
Знак зодиака: 
Зарегистрирован: 13.06.2007
Сообщения: 3
|
|
|
Цитата |
|
кто-нибудь может кинуть пример копирования настроек безопасности через GetFileSecurity/SetFileSecurity? я облазил весь инет, ничего толкового не нашел
Добавлено спустя 58 минут 46 секунд:
в общем подумал я и написал следующий код:
| delphi: | function WindowsCopyFileSec(FromDir, ToDir : string) : boolean; var PSecDesc : PSecurityDescriptor; SizeNeeded : DWORD; procedure CopyAR(FromDir, ToDir : string; ReqInfo: Cardinal); begin GetFileSecurity(PChar(FromDir), ReqInfo, PSecDesc, 1024, SizeNeeded); SetFileSecurity(PChar(ToDir), ReqInfo, PSecDesc); end; procedure CopyA(FromDir, ToDir: String); var Found : integer; SRec : TSearchRec; s : String; AFrom, ATo : String; begin if not DirectoryExists(ToDir) then begin MkDir(ToDir); CopyAR(FromDir, ToDir, DACL_SECURITY_INFORMATION); end; if FindFirst(FromDir + '\*.*', faAnyFile, SRec) = 0 then begin repeat if (SRec.name <> '.') and (SRec.name <> '..') then begin AFrom := FromDir + '\' + SRec.Name; ATo := ToDir + '\' + SRec.Name; if (SRec.Attr and faDirectory) = faDirectory then CopyA(AFrom, ATo) else begin CopyFile(PChar(AFrom), PChar(ATo), False); CopyAR(AFrom, ATo, DACL_SECURITY_INFORMATION); end; end; until FindNext(SRec) <> 0; FindClose(SRec); end; end; begin GetMem(PSecDesc, 1024); try CopyA(FromDir, ToDir); finally FreeMem(PSecDesc); end; end;
|
похоже, работает, всем спасибо  _________________ если всех людей земли организовать умело... |
|
| В начало |
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
как оказалось, я ошибался и GetFileSecurity/SetFileSecurity тут ни при чем.
потому с твоим решением не могу согласиться.
пару часов ковыряния в win32 sdk привело меня к написанию вот такой вот функции (см. ниже)
как оказалось, все совсем иначе, но так же просто.
| delphi: | uses Windows, AclAPI, AccCtrl; ... function CopyAccessSecurity(SrcFile, DestFile: string): DWORD; var pDACL: PACL; pSD: PSECURITY_DESCRIPTOR; begin result := GetNamedSecurityInfo(Pchar(SrcFile), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, PACL(@pDACL), nil, pSD); if result <> ERROR_SUCCESS then exit; result := SetNamedSecurityInfo(Pchar(DestFile), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, pDACL, nil); end;
|
таким образом, копирование файла вместе с правами доступа выглядит так:
| delphi: | CopyFile(FileSrc, FileDest, true); CopyAccessSecurity(FileSrc, FileDest);
|
_________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
|