политики безопасности в WinAPI

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by grinay, 7 Dec 2006.

  1. grinay

    grinay IQ- 137%

    Joined:
    15 Jun 2004
    Messages:
    409
    Likes Received:
    174
    Reputations:
    305
    вопрос. С помощью какой функции WinAPI можно выставить политики безопасности к какталогу тоесть пользоватей группы и их права??
     
  2. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
  3. TaNkist

    TaNkist Elder - Старейшина

    Joined:
    6 Apr 2006
    Messages:
    147
    Likes Received:
    47
    Reputations:
    19
    Вот пример, разрешяющий всем читать, запись, выполнять файл:
    Code:
    
    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
    
     
  4. Brun

    Brun Elder - Старейшина

    Joined:
    21 Mar 2006
    Messages:
    95
    Likes Received:
    57
    Reputations:
    16
    Это не подойдёт? http://www.vclcomponents.com/Delphi/Components_Collection/NTSet-info.html
     
  5. grinay

    grinay IQ- 137%

    Joined:
    15 Jun 2004
    Messages:
    409
    Likes Received:
    174
    Reputations:
    305
    Всем пасиб но эт не много не то уже сам разобрался.