Sicherheitseinstellungen von Dateien ändern
In der MSDN habe ich dazu folgendes gefunden
file security and access rights Komme damit & den weiterführenden Links aber noch nicht klar. Weiß nicht, wie ich die Funktionen richtig kombinieren muß. Wie kann ich die Sicherheitseinstellungen für bestimmte Dateien ändern? Ein kleines Code Beispiel wäre sehr hilfreich. |
Re: Sicherheitseinstellungen von Dateien ändern
Weiß keiner nen Ansatz?
Möchte nur paar Rechte entfernen bzw. hinzufügen können. |
Re: Sicherheitseinstellungen von Dateien ändern
Hallo,
schau mal in der OH unter SetFileAttributes nach. Das währe jetzt aber eine Änderung direkt für die Datei, nicht fürs System. Schau mir gleich noch mal deinen Link an. Gruß oki |
Re: Sicherheitseinstellungen von Dateien ändern
Ja o.k.,
da mußt du dir nur erst das Handle mit createFile holen um dann die Attribute zu setzen. Hab ich alles so aber noch nie gebraucht und deshalb auch keine praktischen Erfahrungen. Probiers erst mal aus. Gruß oki |
Re: Sicherheitseinstellungen von Dateien ändern
Genau, die Funktion SetFileAttributes kann zu wenig. Ich brauche eine Möglichkeit die Berechtigungen der Sicherheitseinstellungen für eine Datei ändern zu können. Und das geht irgendwie über SetSecurityInfo, nur ich weiß praktisch nicht richtig wie.
|
Re: Sicherheitseinstellungen von Dateien ändern
Also,
hab ich so noch nie gemacht und ist auch im Ansatz ungetestet. Ich denke aber, so kommst du weiter.
Delphi-Quellcode:
Nach dem alles geklappt hat vergiß CloseFile nicht!
Function OpenFileSecure: Boolean;
var FiH : THandle; FiName : String; SecAtr : Security_Attributes; begin Result := False; // Dateiname mit komlettem Pfad FiName := 'MeineDatei' + 0; // Security_Attributes - Struktur füllen Fillchar(SecAtr, Length(Security_Attributes), 0); secAtr.bInheritHandle := True; secAtr.nLength := Length(SecAtr); // Handle holen FiH := CreateFile( @FiName[1], FILE_ALL_ACCESS, FILE_SHARE_WRITE, secAtr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // Handle prüfen If FiH = 0 then Exit; // und jetzt SetSecurityInfo Result := True; end; Gruß oki |
Re: Sicherheitseinstellungen von Dateien ändern
Danke, der Ansatz ist OK. Nur das Problem im weiteren ist der security descriptor. Wie arbeitet man damit?
Mir würde ja schon das Anzeigen davon erstmal genügen. |
Re: Sicherheitseinstellungen von Dateien ändern
Mach es dir einfach,
ruf erst GetSecurityInfo oder GetNamedSecurityInfo auf, vweänder die entsprechenden Flags und setze die neuen Werte dann über sie ensprechende Set-Methode. Vergiß aber den ganzen Freigabekram nicht. Also immer schön die OH lesen. Gruß oki |
Re: Sicherheitseinstellungen von Dateien ändern
Ich würde nur gerne erstmal die Infos anzeigen lassen und das alles besser zu verstehen. Nur bekomm ich dieses Auslesen und Anzeigen (Umwandlung dere Infos als strings) nicht hin.
|
Re: Sicherheitseinstellungen von Dateien ändern
ich muß jetzt leider los,
probier mal rum, sag mir bis morgen wie weit du bist und ich helf weiter. (Vielleicht findet sich noch einer zwischendurch, der dir mehr dazu sagen kann) Gruß oki |
Re: Sicherheitseinstellungen von Dateien ändern
Zur Zeit sieht es so aus:
Delphi-Quellcode:
Also fast alles noch von dir. Nur ich bekomme das einfach nicht richtig weiter hin. Zum verzweifeln.
var FileH : THandle;
FileName : String; SecAtr : Security_Attributes; begin if OpenDialog1.Execute then begin // Dateiname mit komlettem Pfad FileName := OpenDialog1.FileName; // Security_Attributes - Struktur füllen Fillchar(SecAtr, SizeOf(Security_Attributes), 0); SecAtr.bInheritHandle := True; SecAtr.nLength := SizeOf(SecAtr); // SecAtr.lpSecurityDescriptor := // Handle holen FileH := CreateFile( PChar(FileName), GENERIC_ALL,//FILE_ALL_ACCESS, FILE_SHARE_WRITE, SecAtr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // Handle prüfen If (FileH <> 0) and (GetLastError = Error_Success) then begin // und jetzt SetSecurityInfo auslesen end; CloseHandle(FileH); end; end; [edit=sakura]Doppelpost gelöscht. Mfg, sakura[/edit] |
Re: Sicherheitseinstellungen von Dateien ändern
Hi,
beim rumtesten mit CreateFile bin ich auf die API-Methode GetFileSecurity gestoßen. Da kann man sich CreateFile offensichtlich spaaren. GetSecurityInfo hat mein Compiler aber nicht gefunden. Ich nutze D5 und arbeite auf Win2000. GetSecurityInfo ist auch eine reine NT-Methode! Da ich den Code jetzt auch mal ausprobiert habe gebe ich die hier gleich mal die Korrektur. Da waren einige Flüchtigkeitsfehler drin.
Delphi-Quellcode:
Mal schaun wie wir so weiterkommen.private { Private-Deklarationen } FFiH : THandle; Function TForm1.OpenFileSecure: Boolean; var FiName : String; SecAtr : Security_Attributes; SD : SECURITY_DESCRIPTOR; begin Result := False; // Dateiname mit komlettem Pfad FiName := Edit1.Text + #0; If Length(FiName) = 0 then Exit; // Security_Attributes - Struktur füllen Fillchar(SecAtr, Sizeof(Security_Attributes), 0); secAtr.bInheritHandle := True; secAtr.nLength := Sizeof(SecAtr); // Handle hilen FFiH := CreateFile( @FiName[1], GENERIC_READ or GENERIC_WRITE, FILE_SHARE_WRITE, @secAtr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // Handle prüfen If (FFiH = 0) or (GetLastError <> Error_Success) then Exit; ChangeItems(FFiH); // und jetzt SetSecurityInfo { GetSecurityInfo(FFiH, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION, nil, nil, nil, nil, nil); } Result := True; end; |
Re: Sicherheitseinstellungen von Dateien ändern
Mit dem GetSecurityInfo hast du natürlich Recht. :oops:
So, jetzt sind wir also bei dem tollen Auslesen der Infos (PSECURITY_DESCRIPTOR) mit dem Setzen von SECURITY_INFORMATION die wir von GetFileSecurity bekommen. |
Re: Sicherheitseinstellungen von Dateien ändern
o.k.,
ich hab beim verfolgen von PSECURITY_DESCRIPTOR in der Unit Windows folgende Structur gefunden:
Delphi-Quellcode:
So wie ich es verstanden habe kann man hier jedoch nicht auf die entsprechenden Felder direkt zugreifen, sondern muß sich weiterer Methoden zum Auslesen bedienen.
PSecurityDescriptor = ^TSecurityDescriptor;
_SECURITY_DESCRIPTOR = record Revision: Byte; Sbz1: Byte; Control: SECURITY_DESCRIPTOR_CONTROL; Owner: PSID; Group: PSID; Sacl: PACL; Dacl: PACL; end; In der Hilfe für GetFileSecurity finden sich entsprechende Verweise: Zitat:
Gruß oki |
Re: Sicherheitseinstellungen von Dateien ändern
Den Typ PSecurityDescriptor hatte ich auch gefunden, nur darin sind die Eigenschaften wieder extrem verschachtelt (verweisen auf andere Typen), was das Auslesen hier auch zum Problem macht. :(
Schauen wir mal wie weit wir kommen. |
Re: Sicherheitseinstellungen von Dateien ändern
Ja also, wir kommen so weiter:
in der Hilfe zu GetFileSecurity ist folgendes vermerkt: Zitat:
. Dort findest du die Links zu den von mir angeführten Methoden. Somit heißt das, das wenn du den PSECURITY_DESCRIPTOR mit GetFileSecurity bekommen hast, du die Elemente der Struktur (wie oben) mit diesen Methoden ermitteln kannst. Bsp.: Zitat:
Gruß oki |
Re: Sicherheitseinstellungen von Dateien ändern
Hm, nur ich scheitere ja gerade an der Verwendung von GetSecurityDescriptorControl und der SECURITY_DESCRIPTOR_CONTROL Struktur. Daher komm ich ja nicht weiter.
|
Re: Sicherheitseinstellungen von Dateien ändern
Hi,
poste mal schnell den aktulen Stand deines Codes. Gruß oki |
Re: Sicherheitseinstellungen von Dateien ändern
Hier mein Stand, wie du siehst ist GetSecurityDescriptorControl noch ziemlich mit Fragezeichen behaftet. Der Weg müßte aber OK sein.
Delphi-Quellcode:
private
{ Private-Deklarationen } FFiH : THandle; ... procedure TForm1.Button1Click(Sender: TObject); var FileName: String; SecAtr: Security_Attributes; SD: SECURITY_DESCRIPTOR; PSD: PSecurity_Descriptor; PSDSize, needed: dword; begin if OpenDialog1.Execute then begin FileName := OpenDIalog1.FileName; If Length(FileName) = 0 then Exit; // Security_Attributes - Struktur füllen Fillchar(SecAtr, Sizeof(Security_Attributes), 0); secAtr.bInheritHandle := True; secAtr.nLength := Sizeof(SecAtr); // secAtr.lpSecurityDescriptor := nil; if (GetFileSecurity(PChar(FileName), OWNER_SECURITY_INFORMATION, PSD, PSDSize, needed) = true) and (GetLastError = Error_Success) then begin if (GetSecurityDescriptorControl(PSD, SE_OWNER_DEFAULTED, ?) = true) and (GetLastError = Error_Success) then begin end; end; end; end; |
Re: Sicherheitseinstellungen von Dateien ändern
jo,
ich denk so:
Delphi-Quellcode:
probier mal.var PControl : SECURITY_DESCRIPTOR_CONTROL; Revision : DWORD; if (GetSecurityDescriptorControl(PSD, PControl, Revision ) ) and (GetLastError = Error_Success) then begin Gruß oki |
Re: Sicherheitseinstellungen von Dateien ändern
Nur das PControl muß doch entsprechend dem OWNER_SECURITY_INFORMATION im GetFileSecurity gesetzt werden? Das liefert doch ncihts zurück?!
|
Re: Sicherheitseinstellungen von Dateien ändern
Wer behauptet das?
|
Re: Sicherheitseinstellungen von Dateien ändern
Das habe ich mir so gedacht?! :roll:
|
Re: Sicherheitseinstellungen von Dateien ändern
Da kann ja jeder kommen :lol: !
Schau noch mal in der OH nach. Gruß oki |
Re: Sicherheitseinstellungen von Dateien ändern
Ups, das OWNER_SECURITY_INFORMATION bekommt ja den Wert zugewiesen. :oops:
Bist du evtl. schon etwas weiter gekommen? |
Re: Sicherheitseinstellungen von Dateien ändern
Nööö!
bei mir geht gar nichts und ich sitze noch nicht mal an meinem Rechner. Alle pure Theorie. Gruß oki |
Re: Sicherheitseinstellungen von Dateien ändern
Zitat:
|
Re: Sicherheitseinstellungen von Dateien ändern
Moin Tpercon,
probier mal dies:
Delphi-Quellcode:
var
psd : PSECURITY_DESCRIPTOR; dwLen : DWORD; psdc : SECURITY_DESCRIPTOR_CONTROL; dwDummy : DWORD; begin if not OpenDialog1.Execute then exit; // erforderliche Buffergrösse ermitteln dwLen := 0; psd := nil; GetFileSecurity(PChar(OpenDialog1.FileName),OWNER_SECURITY_INFORMATION,psd,0,dwLen); // Security Descriptor auslesen psd := AllocMem(dwLen); try if not GetFileSecurity(PChar(OpenDialog1.FileName),OWNER_SECURITY_INFORMATION,psd,dwLen,dwLen) then begin ShowMessage(SysErrorMessage(GetLastError)); exit; end; GetSecurityDescriptorControl(psd,psdc,dwDummy); Memo1.Lines.Clear; if (psdc and SE_DACL_AUTO_INHERITED) = SE_DACL_AUTO_INHERITED then Memo1.Lines.Add('SE_DACL_AUTO_INHERITED'); if (psdc and SE_DACL_DEFAULTED) = SE_DACL_DEFAULTED then Memo1.Lines.Add('SE_DACL_DEFAULTED'); if (psdc and SE_DACL_PRESENT) = SE_DACL_PRESENT then Memo1.Lines.Add('SE_DACL_PRESENT'); if (psdc and SE_DACL_PROTECTED) = SE_DACL_PROTECTED then Memo1.Lines.Add('SE_DACL_PROTECTED'); if (psdc and SE_GROUP_DEFAULTED) = SE_GROUP_DEFAULTED then Memo1.Lines.Add('SE_GROUP_DEFAULTED'); if (psdc and SE_OWNER_DEFAULTED) = SE_OWNER_DEFAULTED then Memo1.Lines.Add('SE_OWNER_DEFAULTED'); if (psdc and SE_SACL_AUTO_INHERITED) = SE_SACL_AUTO_INHERITED then Memo1.Lines.Add('SE_SACL_AUTO_INHERITED'); if (psdc and SE_SACL_DEFAULTED) = SE_SACL_DEFAULTED then Memo1.Lines.Add('SE_SACL_DEFAULTED'); if (psdc and SE_SACL_PRESENT) = SE_SACL_PRESENT then Memo1.Lines.Add('SE_SACL_PRESENT'); if (psdc and SE_SACL_PROTECTED) = SE_SACL_PROTECTED then Memo1.Lines.Add('SE_SACL_PROTECTED'); if (psdc and SE_SELF_RELATIVE) = SE_SELF_RELATIVE then Memo1.Lines.Add('SE_SELF_RELATIVE'); finally FreeMem(psd,dwLen); end; end; |
Re: Sicherheitseinstellungen von Dateien ändern
Hi Tpercon,
da hat Christian uns doch scho den nächsten Teil geliefert. Probiers mal aus und sag wies weitergehen soll. Gruß oki |
Re: Sicherheitseinstellungen von Dateien ändern
Danke Christian, das geht soweit.
@ Oki: Als nächstes kommt das GetSecurityDescriptorDacl und GetSecurityDescriptorSacl, was aber nicht gerade einfach aussieht. |
Re: Sicherheitseinstellungen von Dateien ändern
Hi Tpercon,
die Ergebnisse für DACL und SACL hat uns Christian aber schon geliefert. Gruß oki PS: Wo wollten wir eigentlich noch mal hin? |
Re: Sicherheitseinstellungen von Dateien ändern
Die Sicherheitseinstellungen für die gewählte Datei so anzeigen, wie sie z.B. im Explorer angezeigt werden (welcher User darf was...).
|
Re: Sicherheitseinstellungen von Dateien ändern
Moin Zusammen,
um SACL erhalten zu können, muss man das Privileg SE_SECURITY_NAME enabled haben, was bei mir unter W2K nicht standardmässig der Fall ist. Dazu werden dann GetCurrentProcess, OpenProcessToken, LookupPrivilegeValue und AdjustTokenPriviliges benötigt. |
Re: Sicherheitseinstellungen von Dateien ändern
Hi,
erstmal Dank an Cristian. Das hilft mächtig weiter. Mit GetCurrentProcess, OpenProcessToken und AdjustTokenPriviliges hab ich schon mal gearbeitet. Ich schau mal gleich meine Quellen durch wie ich das damals gemacht hab. Gruß oki |
Re: Sicherheitseinstellungen von Dateien ändern
Das wäre super!
|
Re: Sicherheitseinstellungen von Dateien ändern
@ Oki: Hast du vielleicht was gefunden?
Vorallem im Bezug auf
Schönen Tag noch |
Re: Sicherheitseinstellungen von Dateien ändern
Hi,
ich hab folgendes ausprobiert, was auch funzt. Ich weiß nur nicht wo uns das weiterhilft. Leider hab ich die Aufgabenstellung und deren Sinn immer noch nicht verstanden. Deshalb teste ich im Moment nur das aus was du fragst und arbeite nicht an einer zielorientierten Lösung.
Delphi-Quellcode:
Gruß oki
var
FiName : String; psd : PSECURITY_DESCRIPTOR; dwLen : DWORD; psdc : SECURITY_DESCRIPTOR_CONTROL; dwDummy : DWORD; lpbDaclPresent : Bool; lpbDaclDefaulted : Bool; pDacl : PACL; lpbSaclPresent : Bool; lpbSaclDefaulted : Bool; pSacl : PACL; begin Result := False; // if not OpenDialog1.Execute then exit; FiName := Edit1.Text + #0; // erforderliche Buffergrösse ermitteln dwLen := 0; psd := nil; GetFileSecurity(PChar(FiName),OWNER_SECURITY_INFORMATION,psd,0,dwLen); // Security Descriptor auslesen psd := AllocMem(dwLen); try if not GetFileSecurity(PChar(OpenDialog1.FileName),OWNER_SECURITY_INFORMATION,psd,dwLen,dwLen) then begin ShowMessage(SysErrorMessage(GetLastError)); exit; end; GetSecurityDescriptorControl(psd,psdc,dwDummy); Memo1.Lines.Clear; if (psdc and SE_DACL_AUTO_INHERITED) = SE_DACL_AUTO_INHERITED then Memo1.Lines.Add('SE_DACL_AUTO_INHERITED'); if (psdc and SE_DACL_DEFAULTED) = SE_DACL_DEFAULTED then Memo1.Lines.Add('SE_DACL_DEFAULTED'); if (psdc and SE_DACL_PRESENT) = SE_DACL_PRESENT then Memo1.Lines.Add('SE_DACL_PRESENT'); if (psdc and SE_DACL_PROTECTED) = SE_DACL_PROTECTED then Memo1.Lines.Add('SE_DACL_PROTECTED'); if (psdc and SE_GROUP_DEFAULTED) = SE_GROUP_DEFAULTED then Memo1.Lines.Add('SE_GROUP_DEFAULTED'); if (psdc and SE_OWNER_DEFAULTED) = SE_OWNER_DEFAULTED then Memo1.Lines.Add('SE_OWNER_DEFAULTED'); if (psdc and SE_SACL_AUTO_INHERITED) = SE_SACL_AUTO_INHERITED then Memo1.Lines.Add('SE_SACL_AUTO_INHERITED'); if (psdc and SE_SACL_DEFAULTED) = SE_SACL_DEFAULTED then Memo1.Lines.Add('SE_SACL_DEFAULTED'); if (psdc and SE_SACL_PRESENT) = SE_SACL_PRESENT then Memo1.Lines.Add('SE_SACL_PRESENT'); if (psdc and SE_SACL_PROTECTED) = SE_SACL_PROTECTED then Memo1.Lines.Add('SE_SACL_PROTECTED'); if (psdc and SE_SELF_RELATIVE) = SE_SELF_RELATIVE then Memo1.Lines.Add('SE_SELF_RELATIVE'); pDacl := nil; GetSecurityDescriptorDacl(psd, lpbDaclPresent, pDacl, lpbDaclDefaulted); IF lpbDaclPresent then begin Memo1.lines.add('DACL-ACL-Count: ' + inttostr(pDacl^.AceCount)); Memo1.lines.add('DACL-ACL-Size: ' + inttostr(pDacl^.AclSize)); end else begin Memo1.Lines.Add('security descriptor does not contain a discretionary ACL for DACL'); end; pSacl := nil; GetSecurityDescriptorSacl(psd, lpbSaclPresent, pSacl, lpbSaclDefaulted); IF lpbSaclPresent then begin Memo1.lines.add('SACL-ACL-Count: ' + inttostr(pSacl^.AceCount)); Memo1.lines.add('SACL-ACL-Size: ' + inttostr(pSacl^.AclSize)); end else begin Memo1.Lines.Add('security descriptor does not contain a discretionary ACL for SACL'); end; Result := True; finally FreeMem(psd,dwLen); end; |
Re: Sicherheitseinstellungen von Dateien ändern
Hm, ich bekomme bei jeder Datei security descriptor does not contain a discretionary ACL for DACL bzw. security descriptor does not contain a discretionary ACL for SACL? Das gleiche Problem hatte ich leider auch schon in einer Version von mir.
Man kann für jede Datei die Sicherheitseinstellungen im Explorer ändern. Dies möchte ich durch meine eigene Anwendung ermöglichen. Dafür möchte ich aber erstmal die Infos auslesen, um mich damit vertraut zu machen und alles genau zu verstehen. |
Re: Sicherheitseinstellungen von Dateien ändern
wir haben genau den Fall für
Zitat:
Ich verstehe das so, das im SECURITY_DESCRIPTOR_CONTROL das Flag SE_SACL_DEFAULTED gesetzt ist. Was immer uns das auch sagen soll. Übrigens hab ich immer noch nicht verstanden wo der Unterschied zwischen DACL und SACL besteht. Gruß oki PS: positiv ist auf jeden fall, dass die Methoden funzen. GetSecurityDescriptorGroup hab ich mir gespaart, weil genause. |
Re: Sicherheitseinstellungen von Dateien ändern
OK, soweit klar bzw. unklar.
Nur wir bekommen doch eigentlich ein SE_SELF_RELATIVE anstatt SE_SACL_DEFAULTED zurück?! Eine Frage zu dem GetSecurityDescriptorGroup und der SID. Wie arbeite ich mit derSID und LookUpAccountName / LookUpAccountSID? Als nächstes wäre also die Arbeit mit den Funktionen GetAce, GetLengthSid, GetAclInformation dran. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:20 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