Hallo DPler,
ich muss gerade eine große Anzahl von Verzeichnissen und Dateien mit neuen
Berechtigungen "versorgen". Dazu möchte ich die
JwSCL verwenden, was ansatzweise auch schon funktioniert.
Problem: Einige Dateien in der Verzeichnisstruktur haben explizite
Berechtigungen, die ich ersetzen müsste. Allerdings möchte ich das nicht für jede Datei einzeln machen sondern über Vererbung der
Berechtigungen aus einem übergeordneten
Verzeichnis. Würde funktionieren, wenn die Vererbung der Rechte dieser speziellen Dateien nicht entfernt worden wäre.
Beim Setzen der Rechte über den Explorer gibt es die schöne Option "Alle
Berechtigungen für untergeordnete Objekte durch vererbbare
Berechtigungen von diesem Objekt ersetzen". Genau das brauche ich für die
JwSCL.
Weiß jemand, wie man das der
JwSCL klar macht?
Viele Grüße,
Uwe
P.S.:
Meine bisherigen (erfolglosen) Versuche basieren in etwa auf diesem Code aus den Beispielen zur
JwSCL:
Delphi-Quellcode:
if not DirectoryExists(Directory)
then
exit;
try
JwInitWellKnownSIDs;
UserToken := TJwSecurityToken.CreateTokenEffective(MAXIMUM_ALLOWED);
Owner := UserToken.GetTokenOwner;
User := TJwSecurityId.Create(_DOMAIN_MACHINE, Group);
// 'Technische_Mitarbeiter'
try
FileObject := TJwSecureFileObject.Create(Directory);
try
//Make me owner if we cant access DACL
if not FileObject.AccessCheck(WRITE_DAC)
// and
{For example purpose only.
We don't have to check the owner because Accesscheck does it.
}
{ not FileObject.Owner.EqualSid(Owner)} then
begin
//try to become owner
JwEnablePrivilege(SE_TAKE_OWNERSHIP_NAME, pst_Enable);
FileObject.Owner := Owner;
end;
DACL := FileObject.DACL;
if ClearList
then
DACL.Clear;
// Problem: AceFlags, Right und ProtState haben keinen Einfluss auf Dateien/Verzeichnisse deren Vererbung entfernt wurde!
DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(
nil, AceFlags, Rights, User, false));
FileObject.SetDACL(DACL, ProtState);
finally
FileObject.Free;
end;
finally
Owner.Free;
UserToken.Free;
User.Free;
end;
except
On E:
Exception do
TB.Msg(E.
Message, clRed);
end;