Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DACL und die Reihenfolge (https://www.delphipraxis.net/85127-dacl-und-die-reihenfolge.html)

Alter Mann 26. Jan 2007 11:50


DACL und die Reihenfolge
 
Hallo,

ich bin gerade dabei für eine spezielle Sache die NTFS-Rechte an Dateiobjekten zu ändern.
Für die Umsetzung greife ich auf TNTFileObject von Colin Wilson zurück.

Es muss die Vererbung von Rechten auf ein Verzeichnis abgeschaltet werden,
sowie ein Gruppenkonto entfernt und ein Benutzerkonto hinzugefügt werden.

Dazu benutze ich folgenden Code:
Delphi-Quellcode:
function CreateFolder(const Path : String;
                      const SamName : String;
                      const MemberOf : String;
                      Memo : TMemo = nil) : Boolean;
var
  FD : Boolean;
  AR : Boolean;
  FO : TNTFileObject;
  ACL: TAccessControlList;
  ACE: TAccessControlElement;
  I,M: Integer;
begin
  FD := ForceDirectories(Path + '\' + SamName);
  if FD then
  begin
    FO := TNTFileObject.Create(Path + '\' + SamName);
    try
       ACL:= TAccessControlList.Create;
       try
         if FO.GetDiscretionaryAccessList(ACL) then
         begin
           M := ACL.ElementCount - 1;
           for I := 0 to M do
           begin
            ACE := TAccessControlElement.Create(ACL.Element[I].Name,
                                                ACL.Element[I].Type_,
                                                ACL.Element[I].Flags xor CONTAINER_INHERIT_ACE,
                                                ACL.Element[I].Mask);
            if POS(MemberOf, ACL.Element[I].Name) = 0 then ACL.AddElement(ACE);
           end;
           for I := 0 to M do ACL.DeleteElement(0);
           ACE := TAccessControlElement.Create(SamName, aeAccessAllowed, EX_MASK_ALL, EX_FILE_All);
           ACL.AddElement(ACE);
           FO.SetDiscretionaryAccessList(ACL);
           AR := True;
         end;
       finally
        ACL.Free;
       end;
    finally
       FO.Free;
    end;
  end;
  if (Memo <> nil) and not FD then Memo.Lines.Add('Error ForceDirectories: ' + Path);
  if (Memo <> nil) and not AR then Memo.Lines.Add('Error FileObjectAccessRights: ' + Path + ' <' + SamName + '>');
  Result := FD and AR;
end;
Mein Problem hierbei ist nun, das der Benutzer nicht in der erwarteten Reihenfolge in der DACL steht.
Kann jemand mal ein kurzen Hinweis geben in welcher Reihenfolge die Einträge sein sollten.

Danke

Alter Mann 28. Jan 2007 10:10

Re: DACL und die Reihenfolge
 
*push*

Christian Seehase 28. Jan 2007 11:43

Re: DACL und die Reihenfolge
 
Moin Alter Mann,

wozu soll den hier das xor dienen?

Delphi-Quellcode:
ACL.Element[I].Flags xor CONTAINER_INHERIT_ACE
or bzw. and not kann ich mir ja noch vorstellen, aber xor :gruebel:

Alter Mann 28. Jan 2007 13:50

Re: DACL und die Reihenfolge
 
Hi,

damit lösche ich den Wert 'CONTAINER_INHERIT_ACE'.

Hat aber nichts mit der Reihenfolge zu tun.

Gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz