Thema: Delphi DACL und die Reihenfolge

Einzelnen Beitrag anzeigen

Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

DACL und die Reihenfolge

  Alt 26. Jan 2007, 11:50
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
  Mit Zitat antworten Zitat