Доброе время суток! Привожу функцию копирования прав доступа с одного файла/папки другому:
Код | function CopyNTFSSecurity3(inFile, outFile: string): Boolean; var psd : PSECURITY_DESCRIPTOR; dwSize: DWord; begin Result := False; psd := nil; if not GetFileSecurity(PChar(inFile), OWNER_SECURITY_INFORMATION + GROUP_SECURITY_INFORMATION + DACL_SECURITY_INFORMATION, Pointer(1), 0, dwSize) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then try psd := HeapAlloc(GetProcessHeap, 8, dwSize); if psd <> nil then begin if not (GetFileSecurity(PChar(inFile), OWNER_SECURITY_INFORMATION + GROUP_SECURITY_INFORMATION + DACL_SECURITY_INFORMATION, psd, dwSize, dwSize)) then begin // Log.Add('Не удалось получить данные о правах доступа файла...'); Exit; end; SetFileSecurity(PChar(outFile), OWNER_SECURITY_INFORMATION + GROUP_SECURITY_INFORMATION + DACL_SECURITY_INFORMATION, psd); end; finally if psd <> nil then HeapFree(GetProcessHeap, 0, psd); end; end;
|
Функция рабочая. Работает в Win7, WinServer 2003, WinServer2008. Проблема в том, что не работает в WinServer 2012. Прошу знающих помочь исправить это. Или, на худой конец, где прочитать отличие по этой теме в новой винде? Я не нашёл ничего такого. Во всех виндовсах приложение запускалось с правами администратора. Если понадобится, могу скинуть весь исходник тествой проги на D7 |