Конференция "WinAPI" » Как дать доступ на папку определённой группе пользователей
 
  • Int23 (24.04.08 11:33) [0]
    Есть группа MyDomain\TestGroup и нужно это группе предоставить доступ "Чтение и выполнение" на папку C:\MyF\ локального компьютера. Как это сделать программно?
  • Дмитрий С (24.04.08 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 := 'Íå óäàëîñü óñòàíîâèòü äàííûå î êàòàëîãå.';
       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;
  • Int23 (24.04.08 14:53) [2]
    Спасибо за функцию. У меня вопрос по параметра AccessPermissions, AccessMode, Ineritance. Мне нужно разрешить чтение и запуск, что я должен передать в те переметры?
  • han_malign © (24.04.08 15:35) [3]

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

    - а передать туда надо - битовые маски описанные в хелпе, и - в конкретных примерах - тоннами валяющиеся в Google на запрос BuildExplicitAccessWithName...
    (RTFM)
  • Дмитрий С (24.04.08 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 © (24.04.08 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}

  • ага (25.04.08 05:20) [6]
    2 Дмитрий С

    Код из [1] на помойку. Читать в MSDN про  canonical order. А заодно и про Generic rights
  • ага (25.04.08 10:21) [7]
  • Дмитрий С (25.04.08 14:45) [8]

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

    Ага... уже мусоровоз вызвал ;)
 
Конференция "WinAPI" » Как дать доступ на папку определённой группе пользователей
Есть новые Нет новых   [134433   +21][b:0][p:0.003]