Помогите разобраться с просмотром прав доступа к папке.
Если у папки стоит разрешение "Чтение выполнение" или "Список содержимого папки", то маски совпадают. Для других разрешений маски разные.
Код:
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.