fchown () unter Windows scheint unmöglich in C zu implementieren

8

* 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() oder SetSecurityInfo .

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)

  • Ich laufe in einem erhöhten Prozess
  • Ich habe SetFileSecurity() aufgerufen gib mir CreateFile()
  • Ich habe die DACLs und die Rechte in meinem Prozesstoken durchlaufen - ich glaube, dass ich als Benutzer mit ausreichenden Rechten ausgeführt werde (sonst würde es mit dem Dateinamen funktionieren)
  • Ich habe versucht, die Datei explizit zu öffnen, indem ich 0 an 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%     
petrsnd 28.07.2014, 23:26
quelle

2 Antworten

6

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.)

    
Harry Johnston 29.07.2014, 00:14
quelle
3

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.

    
arx 29.07.2014 00:16
quelle

Tags und Links