Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.10;
Скачать: CL | DM;

Вниз

Как дать доступ на папку определённой группе пользователей   Найти похожие ветки 

 
Int23   (2008-04-24 11:33) [0]

Есть группа MyDomain\TestGroup и нужно это группе предоставить доступ "Чтение и выполнение" на папку C:\MyF\ локального компьютера. Как это сделать программно?


 
Дмитрий С   (2008-04-24 12:38) [1]

Разбирайся=)
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 := "&#205;&#229; &#243;&#228;&#224;&#235;&#238;&#241;&#252; &#243;&#241;&#242;&#224;&#237;&#238;&#226;&#232;&#242;&#252; &#228;&#224;&#237;&#237;&#251;&#229; &#238; &#234;&#224;&#242;&#224;&#235;&#238;&#227;&#229;.";
   goto FreeAndExit;
 end;

 if not InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION) then
 begin
   LastError := "&#205;&#229; &#243;&#228;&#224;&#235;&#238;&#241;&#252; &#243;&#241;&#242;&#224;&#237;&#238;&#226;&#232;&#242;&#252; &#228;&#224;&#237;&#237;&#251;&#229; &#238; &#234;&#224;&#242;&#224;&#235;&#238;&#227;&#229;.";
   goto FreeAndExit;
 end;

 if not SetSecurityDescriptorDacl(@sd, TRUE, NewAcl, FALSE) then
 begin
   LastError := "&#205;&#229; &#243;&#228;&#224;&#235;&#238;&#241;&#252; &#243;&#241;&#242;&#224;&#237;&#238;&#226;&#232;&#242;&#252; &#228;&#224;&#237;&#237;&#251;&#229; &#238; &#234;&#224;&#242;&#224;&#235;&#238;&#227;&#229;.";
   goto FreeAndExit;
 end;

 if not SetFileSecurity(lpFileName, DACL_SECURITY_INFORMATION, @sd) then
 begin
   LastError := "&#205;&#229; &#243;&#228;&#224;&#235;&#238;&#241;&#252; &#243;&#241;&#242;&#224;&#237;&#238;&#226;&#232;&#242;&#252; &#228;&#224;&#237;&#237;&#251;&#229; &#238; &#234;&#224;&#242;&#224;&#235;&#238;&#227;&#229;.";
   goto FreeAndExit;
 end;
 Result := true;

 FreeAndExit:
     HeapFree(GetProcessHeap(), 0, psd);
end;


 
Int23   (2008-04-24 14:53) [2]

Спасибо за функцию. У меня вопрос по параметра AccessPermissions, AccessMode, Ineritance. Мне нужно разрешить чтение и запуск, что я должен передать в те переметры?


 
han_malign ©   (2008-04-24 15:35) [3]


> Мне нужно разрешить чтение и запуск, что я должен передать в те переметры?

- а передать туда надо - битовые маски описанные в хелпе, и - в конкретных примерах - тоннами валяющиеся в Google на запрос BuildExplicitAccessWithName...
(RTFM)


 
Дмитрий С   (2008-04-24 16:00) [4]

Кстати у меня самого вопрос.

const
 {
   $00000001 - содержание папки, чтение данных
   $00000002 - создание файлов, запись данных
   $00000004 - создание папок, дозапись данных
   $00000008 - чтение дополнительных аттрибутов
   $00000010 - запись дополнительных аттрибутов
   $00000020 - обзор папок, выполнение файлов
   $00000040 - удаление подпапок и файлов
   $00000080 - чтение аттрибутов
   $00000100 - запись аттрибутов

   $00010000 - удаление
   $00020000 - чтение разрешений
   $00040000 - смена разрешений
   $00080000 - смена владельца
 }
 apReadOnly = $00000001 or $00000008 or $00000020 or $00000080 or $00020000;
 apWrite = apReadOnly or $00000002 or $00000004 or $00000010 or $00000040 or $00000100;

Я это подобрал методом подбора. Непомню почему пришлось подбирать.
Так вот проблема такая. Есть папка. С помощью функции задаю права apWrite  .
Получается так. Пользователи, которые получают права по этому правилу могут создавать объекты, а переименовывать не могут.
Открываю свойства папки, безопастность, снимаю какую нить галку, затем ставлю - и... у пользователя нормальные права к папке.
В чем может быть проблема?


 
han_malign ©   (2008-04-24 16:49) [5]


> В чем может быть проблема?

в SDK везде еще SYNCHRONIZE присутствует ($00100000), может из-за этого...
JwaWinNT.pas:
//
// Define access rights to files and directories
//

//
// The FILE_READ_DATA and FILE_WRITE_DATA constants are also defined in
// devioctl.h as FILE_READ_ACCESS and FILE_WRITE_ACCESS. The values for these
// constants *MUST* always be in sync.
// The values are redefined in devioctl.h because they must be available to
// both DOS and NT.
//

 FILE_READ_DATA            = ($0001); // file & pipe
 {$EXTERNALSYM FILE_READ_DATA}
 FILE_LIST_DIRECTORY       = ($0001); // directory
 {$EXTERNALSYM FILE_LIST_DIRECTORY}

 FILE_WRITE_DATA           = ($0002); // file & pipe
 {$EXTERNALSYM FILE_WRITE_DATA}
 FILE_ADD_FILE             = ($0002); // directory
 {$EXTERNALSYM FILE_ADD_FILE}

 FILE_APPEND_DATA          = ($0004); // file
 {$EXTERNALSYM FILE_APPEND_DATA}
 FILE_ADD_SUBDIRECTORY     = ($0004); // directory
 {$EXTERNALSYM FILE_ADD_SUBDIRECTORY}
 FILE_CREATE_PIPE_INSTANCE = ($0004); // named pipe
 {$EXTERNALSYM FILE_CREATE_PIPE_INSTANCE}

 FILE_READ_EA = ($0008); // file & directory
 {$EXTERNALSYM FILE_READ_EA}

 FILE_WRITE_EA = ($0010); // file & directory
 {$EXTERNALSYM FILE_WRITE_EA}

 FILE_EXECUTE = ($0020); // file
 {$EXTERNALSYM FILE_EXECUTE}
 FILE_TRAVERSE = ($0020); // directory
 {$EXTERNALSYM FILE_TRAVERSE}

 FILE_DELETE_CHILD = ($0040); // directory
 {$EXTERNALSYM FILE_DELETE_CHILD}

 FILE_READ_ATTRIBUTES = ($0080); // all
 {$EXTERNALSYM FILE_READ_ATTRIBUTES}

 FILE_WRITE_ATTRIBUTES = ($0100); // all
 {$EXTERNALSYM FILE_WRITE_ATTRIBUTES}

 FILE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $1FF);
 {$EXTERNALSYM FILE_ALL_ACCESS}

 FILE_GENERIC_READ = (STANDARD_RIGHTS_READ or FILE_READ_DATA or
   FILE_READ_ATTRIBUTES or FILE_READ_EA or SYNCHRONIZE);
 {$EXTERNALSYM FILE_GENERIC_READ}

 FILE_GENERIC_WRITE = (STANDARD_RIGHTS_WRITE or FILE_WRITE_DATA or
   FILE_WRITE_ATTRIBUTES or FILE_WRITE_EA or FILE_APPEND_DATA or SYNCHRONIZE);
 {$EXTERNALSYM FILE_GENERIC_WRITE}

 FILE_GENERIC_EXECUTE = (STANDARD_RIGHTS_EXECUTE or FILE_READ_ATTRIBUTES or
   FILE_EXECUTE or SYNCHRONIZE);
 {$EXTERNALSYM FILE_GENERIC_EXECUTE}


 
ага   (2008-04-25 05:20) [6]

2 Дмитрий С

Код из [1] на помойку. Читать в MSDN про  canonical order. А заодно и про Generic rights


 
ага   (2008-04-25 10:21) [7]

2 Int23
http://delphikingdom.com/asp/answer.asp?IDAnswer=60081


 
Дмитрий С   (2008-04-25 14:45) [8]


> ага   (25.04.08 05:20) [6]

Ага... уже мусоровоз вызвал ;)



Страницы: 1 вся ветка

Текущий архив: 2009.05.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
2-1222512134
Rav
2008-09-27 14:42
2009.05.10
Как сохранить *.jpg в базу данных


2-1238417114
FS
2009-03-30 16:45
2009.05.10
EncodeDate vs. StrToDate


4-1209407048
Dmitry_177
2008-04-28 22:24
2009.05.10
autorun.inf


2-1238400479
SP
2009-03-30 12:07
2009.05.10
Иерархическая таблица. Как лучше реализовать?


15-1236547810
Юрий
2009-03-09 00:30
2009.05.10
С днем рождения ! 9 марта 2009 понедельник