Gewusst wie: freigeben von Speicher zwischen services und Benutzer-Prozesse?
Habe ich eine Reihe von Win32-Anwendungen, die Freigabe von Informationen über ein shared-memory-segment angelegt mit CreateFileMapping()
und MapViewOfFile()
. Eine der Anwendungen ist ein system-Dienst, der Rest sind gestartet, durch den angemeldeten Benutzer. Unter Windows XP war es kein problem. Wir nannten unsere Segmente "Global\" Etwas und alles war gut.
Zusätzliche Sicherheit in Vista (und vermutlich Windows 7) wird angezeigt, um zu verhindern, dass diese Architektur von der Arbeit. Normale Benutzer, die nicht erlaubt sind zu erstellen (Win32-Fehler 5) - Objekte im globalen namespace. Die MSDN gibt an, dass wenn der account "erstellen globaler" Privileg dann sollte alles gut sein, aber dies scheint nicht der Fall zu sein in der Praxis.
Auch, Vista ist "Integrität" Funktionen angezeigt, um zu verhindern, dass die "niedrige Integrität" Benutzer-Prozesse den Zugriff auf die "hohe Integrität" service-erstellt shared-memory-Objekt. Es sieht aus wie ich sollte in der Lage sein, dies zu beheben, über die einige Magische SetSecurityDescriptorSacl()
Beschwörungsformel, aber ich habe Schwierigkeiten, sprechen zu lernen sacl.
Also die Frage ist: Was ist die richtige Art und Weise der Verwendung eines shared memory-segment, die zwischen Diensten und normalen Benutzer-Prozesse?
Trennen die einfache Antwort von "einfach abschalten UAC" wir sind in einer ziemlich gesperrte Umgebung verfügt, und das ist nicht eine Möglichkeit.
Edit: den Dienst und den Benutzer müssen lese - /Schreibzugriff auf das segment.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der einfachste Weg wäre, um Ihre service-erstellen der shared-memory und geben Sie eine DACL in CreateFileMapping gewährt, dass normale Benutzer lese-Zugriff auf den shared memory.
Normale Benutzer haben nicht die Globale Berechtigung, aber können Dienste haben dieses Privileg. Wenn Sie müssen Sie Ihre Benutzer erstellen, die das shared memory und dann haben die service-Sonde, Sie könnte haben ein IPC-System wo Sie Ihren Benutzer-code sendet eine Nachricht an den Dienst, der die Datei enthält das mapping behandeln, und der service wäre dann rufen Sie DuplicateHandle, um einen Verweis auf Sie. Dies würde erfordern, Ihr service ausführen mit der debug-Privileg.
Die einfachste Möglichkeit zum erstellen einer DACL ist die Verwendung ConvertStringSecurityDescriptorTosecuritydescriptor, die einen string in ein format namens SDDL Angabe der ACL.
Writing Secure Code enthält ein hervorragendes Kapitel über die Erstellung DACL ' s mit SDDL.
"D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)" gibt die DACL. D:P bedeutet dies eine DACL (statt einer SACL . . . Sie würde selten nutzen, SACL ' s), gefolgt von mehreren ACE-strings, die kontrollieren, wer Zugang bekommt. Jeder ist Ein (erlauben) und ermöglicht eine für das Objekt und enthält die Vererbung (OICI). Der erste, der grant all access " (GA - Zuschuss) bis zu System (SY) und Administratoren (BA, built-in administratos). Der Letzte räumt gelesen (GR) für interaktive Benutzer (IU), die der Benutzer tatsächlich angemeldet zu einer Sitzung.
Sobald dies geschehen ist, normale Benutzer sollten in der Lage sein zu nennen, OpenFileMapping in den Griff zu bekommen, um die shared-mapping, und in der Lage sein, um anzeigen in Ihrem Prozess. Da normale Benutzer haben eingeschränkte Rechte auf dem Objekt, Sie müssen sicher sein, um es zu öffnen und Karte für nur lesender Zugriff.
Wenn die Benutzer benötigen schreib-acccess, würden Sie ersetzen, GR mit GWGR. Beachten Sie, dass dies nicht sicher ist - eine begrenzte Benutzer können dann ändern Sie den shared-memory, während Ihr Dienst ist Lesen und versuchen, zu analysieren Informationen, was in einem Absturz Ihren Dienst.