-
Есть группа MyDomain\TestGroup и нужно это группе предоставить доступ "Чтение и выполнение" на папку C:\MyF\ локального компьютера. Как это сделать программно?
-
Разбирайся=) function AddFilePerm(FileName, UserName: string; AccessPermissions: DWORD; AccessMode: ACCESS_MODE; Ineritance: DWORD): boolean; var lpFileName: PChar; lpUserName: PChar; psd: PSECURITY_DESCRIPTOR; sd: SECURITY_DESCRIPTOR; ea: EXPLICIT_ACCESS; OldAcl, NewAcl: PACL; bDaclPresent, bDaclDefaulted: BOOL; dwSize: DWORD;
Label FreeAndExit; begin Result := false; dwSize := 0; lpFileName := PChar(FileName);//'c:\test'; lpUserName := PChar(UserName);//'Dima2';
GetFileSecurity(lpFileName, DACL_SECURITY_INFORMATION, 0, 0, dwSize);
psd := HeapAlloc(GetProcessHeap(), 8, dwSize);
if psd = nil then begin LastError := 'Íå óäàëîñü âûäåëèòü ïàìÿòü.'; Exit; end;
BuildExplicitAccessWithName(@ea, lpUserName, AccessPermissions, AccessMode, Ineritance);
if not GetFileSecurity(lpFileName, DACL_SECURITY_INFORMATION, psd, dwSize, dwSize) then begin LastError := 'Íå óäàëîñü ïîëó÷èòü äàííûå î êàòàëîãå.'; goto FreeAndExit; end;
if not GetSecurityDescriptorDacl(psd, bDaclPresent, OldAcl, bDaclDefaulted) then begin LastError := 'Íå óäàëîñü ïîëó÷èòü äàííûå î êàòàëîãå.'; goto FreeAndExit; end;
//OldAcl := nil;
if SetEntriesInAcl(1, @ea, OldAcl, NewAcl) <> ERROR_SUCCESS then begin LastError := 'Íå óäàëîñü óñòàíîâèòü äàííûå î êàòàëîãå.'; goto FreeAndExit; end;
if not InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION) then begin LastError := 'Íå óäàëîñü óñòàíîâèòü äàííûå î êàòàëîãå.'; goto FreeAndExit; end;
if not SetSecurityDescriptorDacl(@sd, TRUE, NewAcl, FALSE) then begin LastError := 'Íå óäàëîñü óñòàíîâèòü äàííûå î êàòàëîãå.'; goto FreeAndExit; end;
if not SetFileSecurity(lpFileName, DACL_SECURITY_INFORMATION, @sd) then begin LastError := 'Íå óäàëîñü óñòàíîâèòü äàííûå î êàòàëîãå.'; goto FreeAndExit; end; Result := true;
FreeAndExit: HeapFree(GetProcessHeap(), 0, psd); end;
-
Спасибо за функцию. У меня вопрос по параметра AccessPermissions, AccessMode, Ineritance. Мне нужно разрешить чтение и запуск, что я должен передать в те переметры?
-
> Мне нужно разрешить чтение и запуск, что я должен передать в те переметры?
- а передать туда надо - битовые маски описанные в хелпе, и - в конкретных примерах - тоннами валяющиеся в Google на запрос BuildExplicitAccessWithName... (RTFM)
-
Кстати у меня самого вопрос.
const
apReadOnly = $00000001 or $00000008 or $00000020 or $00000080 or $00020000;
apWrite = apReadOnly or $00000002 or $00000004 or $00000010 or $00000040 or $00000100; Я это подобрал методом подбора. Непомню почему пришлось подбирать. Так вот проблема такая. Есть папка. С помощью функции задаю права apWrite . Получается так. Пользователи, которые получают права по этому правилу могут создавать объекты, а переименовывать не могут. Открываю свойства папки, безопастность, снимаю какую нить галку, затем ставлю - и... у пользователя нормальные права к папке. В чем может быть проблема?
-
> В чем может быть проблема?
в SDK везде еще SYNCHRONIZE присутствует ($00100000), может из-за этого... JwaWinNT.pas:
FILE_READ_DATA = ($0001);
FILE_LIST_DIRECTORY = ($0001);
FILE_WRITE_DATA = ($0002);
FILE_ADD_FILE = ($0002);
FILE_APPEND_DATA = ($0004);
FILE_ADD_SUBDIRECTORY = ($0004);
FILE_CREATE_PIPE_INSTANCE = ($0004);
FILE_READ_EA = ($0008);
FILE_WRITE_EA = ($0010);
FILE_EXECUTE = ($0020);
FILE_TRAVERSE = ($0020);
FILE_DELETE_CHILD = ($0040);
FILE_READ_ATTRIBUTES = ($0080);
FILE_WRITE_ATTRIBUTES = ($0100);
FILE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $1FF);
FILE_GENERIC_READ = (STANDARD_RIGHTS_READ or FILE_READ_DATA or
FILE_READ_ATTRIBUTES or FILE_READ_EA or SYNCHRONIZE);
FILE_GENERIC_WRITE = (STANDARD_RIGHTS_WRITE or FILE_WRITE_DATA or
FILE_WRITE_ATTRIBUTES or FILE_WRITE_EA or FILE_APPEND_DATA or SYNCHRONIZE);
FILE_GENERIC_EXECUTE = (STANDARD_RIGHTS_EXECUTE or FILE_READ_ATTRIBUTES or
FILE_EXECUTE or SYNCHRONIZE);
-
2 Дмитрий С
Код из [1] на помойку. Читать в MSDN про canonical order. А заодно и про Generic rights
-
-
> ага (25.04.08 05:20) [6]
Ага... уже мусоровоз вызвал ;)
|