Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ordner mit Berechtigungen erstellen inkl. Vererben...(JWSCL) (https://www.delphipraxis.net/149519-ordner-mit-berechtigungen-erstellen-inkl-vererben-jwscl.html)

cherry 23. Mär 2010 12:47


Ordner mit Berechtigungen erstellen inkl. Vererben...(JWSCL)
 
Hi there

Ich möchte in der Lage sein, Ordner zu erstellen, auf die man Benutzer berechtigen kann... Das geht bereits mit nachfolgender Funktion.
Ich habe aber leider festgestellt, dass die Berechtigungen nicht vom entaltenden Ordner an meinen neu erstellten vererbt werden.
Wie mach ich das bloss?

Delphi-Quellcode:
procedure TForm1.CreateDir(DirectoryName: string; FileSetting: TFileSetting);
var
  SD : TJwSecurityDescriptor;
  UserSid : TJwSecurityId;
  SecAttrPtr : PSecurityAttributes;
  AccessMask: Cardinal;
begin

  SD := TJwSecurityDescriptor.CreateDefaultByToken();

  try

    UserSid := TJwSecurityId.Create(EdSystemName.Text, EdAccountName.Text);

    // Kombiniere Berechtigungen
    if FileSetting.Read then
      AccessMask := GENERIC_READ;
    if FileSetting.Write then
      AccessMask := AccessMask or GENERIC_WRITE;
    if FileSetting.Modify then
      AccessMask := GENERIC_READ or GENERIC_WRITE;
    if FileSetting.Execute then
      AccessMask := AccessMask or GENERIC_EXECUTE or GENERIC_READ;
    if FileSetting.FullAccess then
      AccessMask := GENERIC_ALL;

    // Berechtigungseintrag in Liste einfügen
    if AccessMask > 0 then
      SD.DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(nil, [afObjectInheritAce,afContainerInheritAce], AccessMask, UserSid, false));

    // Eventuell neuen Entrag mit anderen Vererbungen setzten "Ordnerinhalt auflisten"
    if (FileSetting.List) and (not FileSetting.FullAccess) then
    begin
      AccessMask := GENERIC_EXECUTE or GENERIC_READ;
      SD.DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(nil, [afContainerInheritAce], AccessMask, UserSid, false));
    end;

    SecAttrPtr := SD.Create_SA();

    jwaWindows.CreateDirectory(PWideChar(DirectoryName), Pointer(SecAttrPtr));
  except
    MessageDlg('Fehler beim erstellen des Ordners oder beim setzen der Berechtigung!', mtError, [mbOK], 0);
  end;

  SD.Free;

end;
Danke schon mal

cherry 23. Mär 2010 13:29

Re: Ordner mit Berechtigungen erstellen inkl. Vererben...(JW
 
Habs selber rausgekriegt. Vielleicht gings auch einfacher.
Erstelle zuerst den Ordner und ändere dan die Berechtigungen...

Delphi-Quellcode:
CreateDirEx(DirectoryName: string; FileSetting: TFileSetting);
var
  UserToken : TJwSecurityToken;
  SD : TJwSecurityDescriptor;
  FileObject : TJwSecureFileObject;
  Owner : TJwSecurityId;
  DACL : TJwDAccessControlList;
  UserSid : TJwSecurityId;
  AccessMask: Cardinal;
begin

  CreateDirectory(PWideChar(DirectoryName), nil);

  if not DirectoryExists(DirectoryName) then
    exit;

  JwInitWellKnownSIDs;
  UserToken := TJwSecurityToken.CreateTokenEffective(MAXIMUM_ALLOWED);
  Owner := UserToken.GetTokenOwner;

  try
    UserSid := TJwSecurityId.Create(EdSystemName.Text, EdAccountName.Text);
  except
    MessageDlg('Benutzer nicht gefunden.', mtError, [mbOK], 0);
    exit;
  end;

  try
    FileObject := TJwSecureFileObject.Create(DirectoryName);

    //Make me owner if we cant access DACL
    if not FileObject.AccessCheck(WRITE_DAC) then
    begin
      //try to become owner
      JwEnablePrivilege(SE_TAKE_OWNERSHIP_NAME, pst_Enable);
      FileObject.Owner := Owner;
    end;

    // combine attributes
    if FileSetting.Read then
      AccessMask := GENERIC_READ;
    if FileSetting.Write then
      AccessMask := AccessMask or GENERIC_WRITE;
    if FileSetting.Modify then
      AccessMask := GENERIC_READ or GENERIC_WRITE;
    if FileSetting.Execute then
      AccessMask := AccessMask or GENERIC_EXECUTE or GENERIC_READ;
    if FileSetting.FullAccess then
      AccessMask := GENERIC_ALL;

    DACL := FileObject.DACL;
     
    // Berechtigungseintrag in Liste einfügen
    if AccessMask > 0 then
      DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(nil, [afObjectInheritAce,afContainerInheritAce], AccessMask, UserSid, false));

    // Eventuell neuen Entrag mit anderen Vererbungen setzten "Ordnerinhalt auflisten"
    if (FileSetting.List) and (not FileSetting.FullAccess) then
    begin
      AccessMask := GENERIC_EXECUTE or GENERIC_READ;
      DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(nil, [afContainerInheritAce], AccessMask, UserSid, false));
    end;    
     
    FileObject.SetDACL(DACL);

  except
    MessageDlg('Fehler beim Setzten der Berechtigungen', mtError, [mbOK], 0);
  end;

  FileObject.Free;
  Owner.Free;
  UserToken.Free;
end;

Alter Mann 23. Mär 2010 18:14

Re: Ordner mit Berechtigungen erstellen inkl. Vererben...(JW
 
Hallo Cherry,

bitte folgendes beachten:
Zitat:

{ Reihenfolge innerhalb der ACL }

Die bevorzugte Reihenfolge von ACEs ist für 4.0 und frühere Windows NT-Versionen einfach.
In einem DACL sollten alle access-denied ACEs vor access-allowed beliebigen ACEs stehen.
Für Windows 2000 oder später ist die richtige Reihenfolge von ACEs komplizierter wegen
der Einführung objektspezifischer ACEs und automatischer Vererbung.

Beschreibt die bevorzugte Reihenfolge für Windows 2000 oder später im Folgenden:
• Platzieren Sie in einer Gruppe vor geerbten beliebigen ACEs alle non-inherit ACEs,
um sicherzustellen, dass non-inherit ACEs über Rangfolge über geerbte ACEs verfügen.
Diese Reihenfolge stellt beispielsweise sicher, dass ein access-denied non-inherit ACE
trotz geerbten beliebigen ACES erzwungen wird, das Zugriff ermöglicht.
• ACEs-Auftragtyp laut ACE wie den folgenden Präsentationen innerhalb der Gruppen von non-inherit ACEs und geerbten ACEs:
• Access-denied ACEs, die für das Objekt gelten.
• Access-denied ACEs, die für einen Unter des Objekts wie einem Eigenschaftssatz oder einer Eigenschaft gelten.
• Access-allowed ACEs, die für das Objekt gelten
• Access-allowed ACEs, die für einen Unter des Objekts gelten
Die einfache Zugriffssteuerung API zu dem Hinzufügen von ACEs zu einem DACL
erzwingen die bevorzugte Reihenfolge nicht. Die AddAce Funktion addiert ACEs an
einem angegebenen Speicherort in einem ACL. Die AddAccessAllowedAce Funktion
fügt ein ACE an dem Ende in einem ACL hinzu. Daher ist es die sicherstellende,
dass die ACEs in der bevorzugten Reihenfolge hinzugefügt werden Aufgabe des Aufrufers.
Habe ich mal bei MSDN gefunden, war glaube ich ein Beispiel für VB.

Dezipaitor 24. Mär 2010 09:14

Re: Ordner mit Berechtigungen erstellen inkl. Vererben...(JW
 
Cherry liest du eigentlich auch Dokumentationen? Create_SA erzeugt einen Speicherbereich, der mit Free_SA gelöscht werden muss.

@Alter Mann
JWSCL stellt sicher, dass die Reihenfolge korrekt ist. Die Reihenfolge von gleichrangingen ACEs bleibt, so gut es geht, erhalten, um die Semantik nicht zu ändern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:14 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