AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Ordner mit Berechtigungen erstellen inkl. Vererben...(JWSCL)

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

Ein Thema von cherry · begonnen am 23. Mär 2010 · letzter Beitrag vom 24. Mär 2010
Antwort Antwort
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#1

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

  Alt 23. Mär 2010, 12:47
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
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#2

Re: Ordner mit Berechtigungen erstellen inkl. Vererben...(JW

  Alt 23. Mär 2010, 13:29
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;
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Alter Mann

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

Re: Ordner mit Berechtigungen erstellen inkl. Vererben...(JW

  Alt 23. Mär 2010, 18:14
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.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#4

Re: Ordner mit Berechtigungen erstellen inkl. Vererben...(JW

  Alt 24. Mär 2010, 09:14
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.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:18 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