Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CreateDirectory vs cacls (https://www.delphipraxis.net/141063-createdirectory-vs-cacls.html)

mikelpahl 1. Okt 2009 16:01


CreateDirectory vs cacls
 
Hallo,

da ich einen Programm geschreiben habe um unsere User im ActiveDirecory anzulegen, würde ich gerne auch die HomeDirectories der User aus Delphi heraus anlegen.

Bisher haben wir unsere Verzeichnisse mit einer Batchdatei angelegt:
md %1
echo J | cacls %1 /C /E /G Administratoren:F
echo J | cacls %1 /C /E /G dh-karlsruhe\%2:F
echo J | cacls %1 /C /E /R Jeder

Ich wollte dies jetzt mit CreateDirectory aus Delphi heraus tun, habe aber keinen Plan wie man einen lpSecurityDescriptor für die dort benötigten SECURITY_ATTRIBUTES aufbaut. Da die Hilfe im Delphi von Version zu Version schlechter wird, habe ich dort auch keine Beispiele gefunden. Habe auch schon mehrere Stunden im DP gesucht.

Hat da einer ein Beispiel für mich.

Gruss

Michael

Alter Mann 1. Okt 2009 17:12

Re: CreateDirectory vs cacls
 
Hi,

schau dir mal dies an:JEDI API LIB & Windows Security Code Library (JWSCL)
Ist ein Spezialgebiet von Christian.

Dort sind auch ein paar Beispiele drin, die ein Einstieg ermöglichen.

Gruß

mikelpahl 26. Okt 2009 14:08

Re: CreateDirectory vs cacls
 
Hallo "Alter Mann",

vielen Dank für den Hinweis. Seltsam dass ich beim Suchen nicht auf die JWSCL selber gestossen bin.
War zwar etwas mühsam sich im großen Umfang der JWSCL das richtige zu suchen. Der Zugriff geht damit super schnell.
So sieht jetzt meine Funktion dazu in Delphi aus:

Delphi-Quellcode:
Function SetDACL_Dir(DirName, StudName, DomainName : String):boolean;
var
  UserToken : TJwSecurityToken;
  FileObject : TJwSecureFileObject;
  Owner : TJwSecurityId;
  StudSid : TJwSecurityId;
  DACL : TJwDAccessControlList;
begin
  result:=true;
  if not DirectoryExists(DirName) then
  begin
    result:=false;
    ErrorDialog('Verzeichnis "'+DirName+'" nicht gefunden!');
  end;
  if result then
  begin
    JwInitWellKnownSIDs;
    UserToken := TJwSecurityToken.CreateTokenEffective(MAXIMUM_ALLOWED);
    Owner := UserToken.GetTokenOwner;
    try
      StudSid := TJwSecurityId.Create(DomainName,Studname);
    except
      result:=false;
      ErrorDialog('Student "'+StudName+'" im Verzeichnis "'+DomainName+'" nicht gefunden!');
    end;
    if result then
    begin
      try
        FileObject := TJwSecureFileObject.Create(DirName);
      except
        result:=false;
        ErrorDialog('Verzeichnis konnte nicht gefunden werden "'+DirName+'" !');
      end;
    end;
    if result then
    begin
      try
        if not FileObject.AccessCheck(WRITE_DAC) then  //Make me owner if we cant access DACL
        begin //try to become owner
          JwEnablePrivilege(SE_TAKE_OWNERSHIP_NAME, pst_Enable);
          FileObject.Owner := Owner;
        end;
        DACL := FileObject.DACL;
        dacl.Clear;
        DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(nil, [afObjectInheritAce,afContainerInheritAce], GENERIC_ALL, Owner, false));
        DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(nil, [afObjectInheritAce,afContainerInheritAce], GENERIC_ALL, StudSid, false));
        FileObject.SetDACL(DACL);
      except
        result:=false;
        ErrorDialog('Fehler beim Setzen der Berechtigung auf "'+DirName+'" !');
      end;
    end;
    Owner.Free;
    UserToken.Free;
    StudSid.free;
    FileObject.Free;
  end;
end; // SetDACL
Gruss

Michael


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