![]() |
![]() |
Правила Форума редакция от 22.06.2020 |
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
Опции темы | Опции просмотра |
![]() |
![]() |
![]() |
Неактивный пользователь
Пол: ![]() Регистрация: 01.01.2007
Сообщений: 64
Репутация: 18
|
![]() Помогите разобраться с просмотром прав доступа к папке.
Проблема в том, что для разрешений "Чтение выполнение" и "Список содержимого папки" получаю одну и туже маску доступа. Для других разрешений маски разные. Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, AclApi, AccCtrl; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); type ACL_SIZE_INFORMATION = record AceCount :DWORD; AclBytesInUse :DWORD; AclBytesFree : DWORD; end; _ACE_HEADER = record AceType : BYTE; AceFlags : BYTE; AceSize : WORD; end; ACCESS_ACE = record Header : _ACE_HEADER; Mask : ACCESS_MASK; SidStart : DWORD; end; var pSD: PSECURITY_DESCRIPTOR; pDACL: PACL; aclInfo: ACL_SIZE_INFORMATION; i:integer; ace: ^ACCESS_ACE; sid: PSID; len:dword; user, domain : array [0..200] of char; sid_nu:SID_NAME_USE; actions:string; const ACCESS_ALLOWED_ACE_TYPE = $00; ACCESS_DENIED_ACE_TYPE = $01; begin if (GetNamedSecurityInfo(PChar(Edit1.Text), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, PACL(@pDACL), nil, pSD)<>ERROR_SUCCESS) then begin ShowMessage('Ошибка'); exit; end; if (pDACL=nil) then begin ShowMessage('Список доступа пуст'); exit; end; if (not GetAclInformation(pDACL^, @aclInfo, sizeOf(aclInfo), AclSizeInformation)) then begin ShowMessage('Не получилось определить информацию об ACL'); exit; end; for i:=0 to aclInfo.AceCount-1 do begin if not (GetAce(pDACL^, i, Pointer(ace))) then continue; sid := PSID(@((ace)^.SidStart)); len := 200; if (LookupAccountSid(nil, sid, user, len, domain, len, sid_nu)) then begin memo1.Lines.Add(StrPas(domain)+'\'+StrPas(user)); end else begin memo1.Lines.Add('Лажа'); end; case (ace^.Header.AceType) of ACCESS_ALLOWED_ACE_TYPE: memo1.Lines.Add('Разрешено'); ACCESS_DENIED_ACE_TYPE: memo1.Lines.Add('Запрещено'); else memo1.Lines.Add('Другое'); end; actions:=''; if (ace^.Header.AceType=ACCESS_ALLOWED_ACE_TYPE) or (ace^.Header.AceType=ACCESS_DENIED_ACE_TYPE) then begin memo1.Lines.Add(actions+' '+inttostr(ace^.Mask)); end; end; end; end. |
![]() |
![]() ![]() |
Реклама: | умывальник для дачи уличный | Интегрируй приложения вместе с Альбато: связать Pinterest - синхронизация за 5 минут! | ал сапиенца | диван еврокнижка фото | катышев сергей |
![]() |
![]() |
Постоялец
![]() ![]() Пол: ![]() Регистрация: 13.03.2008
Адрес: Минск
Сообщений: 257
Репутация: 231
|
![]() Одно из предположений..
Получая список прав доступа, для файла и папки мы будем иметь одну и ту же структуру. Если это папка то применима маска: "Список содержимого папки", иначе :"Чтение выполнение". |
![]() |
![]() ![]() |