![]() |
CreateFile und Security Attributes
hi
das folgende Problem habe ich schon vor längerer Zeit festgestellt. Jedoch bis jetzt nichts dazu finden können. Vielleicht kennt ein einsamer Wanderer, der hier zufällig vorbeikommt die Lösung oder weitere Materialien. Das Problem habe ich bei CreateFile mit dem Parameter SecurityAttributes. Wenn ich eine eigene DACL dort hineinlege, dann wird diese ignoriert und stattdessen, werden die Sicherheitseinstellungen vom Elternordner übernommen. Hier gebe ich mal den Quelltext meines Unit-Testings an, die meine SecurityLibrary testen soll. Es sollte in der Datei SecurityXXXX.pas kompilierbar sein
Delphi-Quellcode:
function TSecureFileObjectTests.GetSecurityFileNameTemp(
out HasSACL: Boolean): String; var pTempName : Array[0..MAX_PATH+1] of char; bI : Boolean; pSecAttr : jwaWinBase.PSecurityAttributes; handle : THANDLE; SDesc : TSecurityDescriptor; pDACL : jwaWinNT.PACL; b : Boolean; c : Cardinal; begin CheckNotEquals(0, GetTempFileName('.', // LPCTSTR lpPathName, 'SMLTest', // LPCTSTR lpPrefixString, 0, // UINT uUnique, @pTempName // LPTSTR lpTempFileName )); //File does not exist!! SDesc := TSecurityDescriptor.Create; SDesc.Owner := SecurityThreadUserSID; //current process user SDesc.OwnOwner := false; // SDesc.DACL.Add(TDiscretionaryAccessControlEntryAllow.Create(nil,[],FILE_ALL_ACCESS,SecurityThreadUserSID, false)); // SDesc.DACL.Add(TDiscretionaryAccessControlEntryAllow.Create(nil,[],FILE_ALL_ACCESS,LocalSystemSID, false)); // SDesc.DACL.Add(TDiscretionaryAccessControlEntryAllow.Create(nil,[af_NO_PROPAGATE_INHERIT_ACE],FILE_ALL_ACCESS,WorldSID, false)); SDesc.DACL.Add(TDiscretionaryAccessControlEntryAllow.Create(nil,[],FILE_ALL_ACCESS,GuestsSID, false)); if IsPrivilegeSet(SE_SECURITY_NAME) then begin EnablePrivilege(SE_SECURITY_NAME, pst_Enable); SDesc.SACL.Add(TAuditAccessControlEntry.Create(nil,true, false, FILE_ALL_ACCESS,SDesc.Owner,false)); SDesc.SACL.Add(TAuditAccessControlEntry.Create(nil,true, false, FILE_ALL_ACCESS,WorldSID,false)); HasSACL := true; end else HasSACL := false; result := ''; try //create SA strcture with no inheritance (false)) pSecAttr := SDesc.Create_SA(false); handle := jwaWindows.CreateFile(pTempName, FILE_ALL_ACCESS, 0, Pointer(pSecAttr), CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); CheckNotEquals(Integer(INVALID_HANDLE_VALUE),Integer(handle), ESMSecurityException.GetLastErrorMessage()); CloseHandle(handle); //XXXXXXXXXXXXXXx //another way to set security without using TSecureFileObject //remove old dac TSecureGeneralObject.SetNamedSecurityInfo(pTempName, SE_FILE_OBJECT, [sif_OWNER_SECURITY_INFORMATION], SDesc.Owner, nil, nil, nil); TSecureGeneralObject.SetNamedSecurityInfo(pTempName, SE_FILE_OBJECT, [sif_DACL_SECURITY_INFORMATION], SDesc.Owner, nil, SDesc.DACL, nil); finally SDesc.Free_SA(pSecAttr); if IsPrivilegeSet(SE_SECURITY_NAME) then begin EnablePrivilege(SE_SECURITY_NAME, pst_Disable); end; end; result := pTempName; end; Wie man hier sehen kann, wird eine neuer SecurityDescriptor gesetzt.
Delphi-Quellcode:
Nur wird der SD ignoriert.
handle := jwaWindows.CreateFile(pTempName,
FILE_ALL_ACCESS, 0, Pointer(pSecAttr), CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); Was jedoch funktioniert ist folgendes:
Delphi-Quellcode:
Man muss den SD zweimal setzen. Das erste Mal löscht man ihn,
TSecureGeneralObject.SetNamedSecurityInfo(pTempName,
SE_FILE_OBJECT, [sif_OWNER_SECURITY_INFORMATION], SDesc.Owner, nil, nil, nil); TSecureGeneralObject.SetNamedSecurityInfo(pTempName, SE_FILE_OBJECT, [sif_DACL_SECURITY_INFORMATION], SDesc.Owner, nil, SDesc.DACL, nil); und das zweite mal setzt man ihn. Dies hab ich jedoch nur aus Tests erfahren. Dokumentiert hab ich es nicht gefunden. |
Re: CreateFile und Security Attributes
hi
kennt jemand noch Foren oder ähnliches, wo man auf solche Threads auch noch Posts bekommt? Muss auch nicht Delphi sein :D THX |
Re: CreateFile und Security Attributes
Moin Dezipaitor,
Zitat:
Zitat:
|
Re: CreateFile und Security Attributes
Zitat:
für die allermeisten Leute hier auf einer zu hohen Stufe?!. Ich hoffe jedoch immer wieder, dass jemand doch schon dieselbe Erfahrung gemacht hat und etwas antworten kann. Desweiteren hoffe ich, dass durch die Niederschrift jemand irgendwann einmal durch eine Suchmaschine, diesen Post findet und mir eine Mail schreibt, weil er gerade dasselbe Problem hat (das passierte schon öfters). Verwöhnt kann ich deshalb schon garnicht sein, weil viele Threads von und für Anfänger geschrieben sind (ich denke da z.B. an den Thread, wie man eine Zahl in Delphi negiert). Das bringt mich jedoch immer wieder zum Lachen - und das hält ja bekanntlich gesund :D Aber manchmal wünsche ich mir schon die guten alten Zeiten zurück. Es scheint, als ob Delphi wirklich ausstirbt? Oder wissen die Profis schon alles? Ups, nein, kann garnet sein. Ich bin ein Profi (=verdiene Geld damit) und weiß net alles über Delphi (ich denke da an den ![]() Zitat:
Trotzdem Danke für deinen Aufwand |
Re: CreateFile und Security Attributes
Hallo Dezipaitor,
reicht das als Tipp? Zitat:
![]() Gruß |
Re: CreateFile und Security Attributes
Uff, das hab ich ganz vergessen.
Wenn man aber das Flag "Protected" dem Security Descriptor übergibt, dann wird die Vererbund an dieser neuen Datei gestoppt und die übergeben ACL verwendet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz