Показать сообщение отдельно

  #3  
Старый 07.12.2006, 13:20
TaNkist
Участник форума
Регистрация: 06.04.2006
Сообщений: 257
Провел на форуме:
367179

Репутация: 76
По умолчанию

Вот пример, разрешяющий всем читать, запись, выполнять файл:
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
 pSD : PSECURITY_DESCRIPTOR;
 pDACL : PACL;
 aclInfo : ACL_SIZE_INFORMATION;
 ace : ^ACCESS_ACE;
 sid  : PSID;
 i : Integer;
 user, domain : array [0..200] of char;
 len: DWORD;
 sid_nu : SID_NAME_USE;
 newAcl : TListItem;
 actions:String;

 sidLength, sidLengthDomain: Cardinal;
 sidType: SID_NAME_USE;
 sidValue: PSID;
 domain1:PChar;
 pNewDACL : PACL;
 pNewSD : PSECURITY_DESCRIPTOR;
 newSize:Integer;
begin
 aclListView.Items.Clear;
 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;

 // Опредеяем SID пользователя, которому нужно дать разрешение
 sidLength:=0;
 sidLengthDomain:=0;
 LookupAccountName(nil, 'everyone', nil, sidLength, nil, sidLengthDomain, sidType);
 sidValue := AllocMem(sidLength);
 domain1 := AllocMem(sidLengthDomain);
 if (LookupAccountName(nil, 'everyone', sidValue, sidLength, domain1, sidLengthDomain, sidType)=false) then
  exit;
 // Выделяем память под новую таблицу
 newSize:=AclInfo.AclBytesInUse + sizeof(ACCESS_ACE) + GetLengthSid(sidValue);
 pNewDACL:=PACL(LocalAlloc(LPTR, newSize));
 if not InitializeAcl(pNewDACL^, newSize, 2) then
  exit;

 for i:=0 to aclInfo.AceCount-1 do
  begin
   if not (GetAce(pDACL^, i, Pointer(ace))) then
    continue;

   newAcl:=aclListView.Items.Add;

   sid := PSID(@((ace)^.SidStart));
   len := 200;
   if (LookupAccountSid(nil, sid, user, len,
             domain, len, sid_nu)) then
    begin
     newAcl.Caption:=user;
     newAcl.SubItems.Add(domain)
    end
   else
    begin
     newAcl.Caption:='Лажа';
     newAcl.SubItems.Add('Лажа')
    end;

   case (ace^.Header.AceType) of
    ACCESS_ALLOWED_ACE_TYPE: newAcl.SubItems.Add('Разрешено');
    ACCESS_DENIED_ACE_TYPE: newAcl.SubItems.Add('Запрещено');
    else newAcl.SubItems.Add('Другое');
   end;

   actions:='';
   if (ace^.Header.AceType=ACCESS_ALLOWED_ACE_TYPE) or
      (ace^.Header.AceType=ACCESS_DENIED_ACE_TYPE) then
    begin
     if (ace^.Mask and $1)=1 then
      actions:=actions+' Чтение';
     if (ace^.Mask and $2)=2 then
      actions:=actions+' Запись';
     if (ace^.Mask and $4)=4 then
      actions:=actions+' Выполнение';
    end;
   newAcl.SubItems.Add(actions);

   // Добавляем запись в новый список
   if not AddAce(pNewDACL^, 2, MAXWORD, ace, ace.Header.AceSize) then
    exit;
  end;

 // Добавляем ещё одну разрешающую запись
 if not AddAccessAllowedAce(pNewDACL^, 2, GENERIC_ALL, sidValue) then
  exit;

 // Инициализируем новый дескриптор
 pNewSD := PSECURITY_DESCRIPTOR(LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH));
 if not InitializeSecurityDescriptor(pNewSD, SECURITY_DESCRIPTOR_REVISION) then
  exit;

 // Устанавливаем дескриптору новый ACL список
 if not SetSecurityDescriptorDacl(pNewSD, TRUE, pNewDACL, FALSE) then
  exit;

 // Устанавливаем дескриптор файлу 
 if not SetFileSecurity(PChar(Edit1.Text), DACL_SECURITY_INFORMATION, pNewSD) then
  exit;
end;
//(c) flenov