* UPDATE *
Die Antworten waren sehr hilfreich und jetzt gibt mein Code ERROR_SUCCESS
zurück. Die Schlüsseländerung schien zu SetKernelObjectSecurity()
zu wechseln. Jetzt sehe ich jedoch ein anderes Problem; Mein Code ist erfolgreich, aber wenn ich auf das Dateisystem schaue oder die Datei im Code überprüfe, hat es immer noch den vorherigen Besitzer.
This wurde bereits zuvor auf SO berichtet , aber ohne eine befriedigende Antwort.
Hier ist ein öffentlicher Schlüssel mit meinem Code . Es fügt etwas Ausgang hinzu, also können Sie sehen, über was ich spreche. Sie sollten in der Lage sein, sie zu einem leeren Visual Studio C ++ - Konsolenprojekt hinzuzufügen und durch sie zu debuggen. Stellen Sie sicher, dass Sie Visual Studio mit "Als Administrator ausführen" öffnen.
* 2. UPDATE *
Ich habe diese Notiz gerade auf MSDN für % co_de gefunden % .
Hinweis Diese Funktion sollte beim Festlegen einer Sicherheitsbeschreibung für Dateisystemobjekte nicht verwendet werden. Verwenden Sie stattdessen die Funktionen
SetKernelObjectSecurity()
oderSetSecurityInfo
.
Ich bin mir nicht sicher, wie ich das vermisst habe ... es ist ganz oben.
* ORIGINAL FRAGE *
Ich muss die äquivalente Funktionalität von SetNamedSecurityInfo
unter Windows implementieren, aber Nach ziemlich viel Forschung und Anstrengung konnte ich es nicht zum Laufen bringen. fchown()
ändert den Besitz einer Datei, die über einen offenen Dateideskriptor angegeben wird. Im Fall von Windows könnte dies entweder ein offener Dateideskriptor oder ein fchown()
sein (Sie können einen von beiden anderen erstellen). Es scheint, dass egal was ich versuche, bekomme ich HANDLE
.
Ich habe beide versucht ERROR_ACCESS_DENIED
und SetSecurityInfo()
. Ich kann die Eigentumsinformationen aus dem geöffneten Dateideskriptor mit den entsprechenden Get * -Funktionen abrufen: SetUserObjectInfo()
und GetSecurityInfo()
.
Wenn ich meinen Code überarbeite, um entweder % co_de zu verwenden % oder GetUserObjectSecurity()
, wo Sie einen Namen für die Datei angeben, anstatt einen offenen GRIFF, alles funktioniert gut.
Habe ich auf die Low-Level-Dateisystem-Zugriffskontrollregeln des Betriebssystems gestoßen?
Ist es nicht möglich, die Eigentümerschaft einer geöffneten Datei unter Windows zu ändern?
Von dem, was ich sagen konnte, konnte ich nicht einmal die DACLs ändern, wenn der GRIFF geöffnet war. Ist Windows nur versucht, mich vor einem falschen Gefühl der Sicherheit zu schützen, wenn ich denke, dass ich die Datei gesichert habe, aber jemand noch einen offenen GRIFF hat?
Mir scheint, wenn ich etwas verpasse, könnte es sein, dass ich SetNamedSecurityInfo()
anrufe.
Im Vorgriff auf einige der Antworten, die veröffentlicht werden könnten:
(Bitte beachten Sie auch, dass dies funktioniert, indem Sie einfach die Objektversionen der Win32-APIs durch solche ersetzen, die den Dateinamen tragen)
SetFileSecurity()
aufgerufen gib mir CreateFile()
AdjustTokenPrivileges()
für SE_TAKE_OWNERSHIP_NAME
. Hier ist ein Code. Ich habe alle Fehlerbehandlung entfernt, so dass diese Frage nicht zu lang ist:
%Vor%Sie benötigen diese Header:
%Vor%Die Funktion SetPrivilege () ist:
%Vor% Sie haben das Handle mit GENERIC_READ
access geöffnet. Windows erzwingt dies; Wenn Sie den Handle auf diese Weise geöffnet haben, können Sie den Handle nur in Leseoperationen verwenden. (Dies bedeutet, dass Windows nur den Zugriff auf das Objekt überprüfen muss, wenn Sie das Handle öffnen. Ab diesem Zeitpunkt wird der Zugriff basierend auf den Zugriffsrechten des Handles gewährt oder verweigert.)
Die Dokumentation zu SECURITY_INFORMATION
zeigt an, welche Zugriffsrechte Sie auf dem Handle benötigen, um die verschiedenen Informationen abzufragen und einzustellen. In Ihrem Fall benötigen Sie WRITE_OWNER
für die Zuweisung der Eigentümerschaft und der primären Gruppe, WRITE_DAC
für die Zuweisung der DACL und READ_CONTROL
für das Lesen der Eigentümerschaft, der primären Gruppe und der DACL.
Beachten Sie, dass GENERIC_WRITE
weder WRITE_OWNER
noch WRITE_DAC
enthält, daher müssen Sie sie explizit angeben.
(Ich finde keine Dokumentation darüber, welche Dateiberechtigungen in GENERIC_ALL
enthalten sind, aber selbst wenn es funktioniert, wäre es vorzuziehen, die von Ihnen verwendeten Berechtigungen explizit anzufordern.)
SetUserObjectInfo
und GetUserObjectSecurity
arbeiten an "Benutzer" -Objekten, die allgemein Fenster-Manager-Objekte sind. Dateien sind Kernel-Objekte, daher benötigen Sie die Funktionen mit Kernel
im Namen wie SetKernelObjectSecurity
. Siehe Objektkategorien .
Das heißt, SetSecurityInfo
sollte funktionieren.
SetFileSecurity
funktioniert für Sie, so dass Sie die entsprechenden Berechtigungen haben müssen.
Höchstwahrscheinlich fordern Sie im Aufruf von CreateFile
nicht die korrekten Zugriffsberechtigungen an. Harry Johnston hat mehr darüber geschrieben, also siehe seine Antwort für Details.