Benutzer mit den meisten Antworten
Datenaustausch über Memory Mapped File zwischen Windows Forms Anwendung und Windows Service

Frage
-
Hallo,
irgendwie klappt dieser Datenaustausch nicht. Wenn ich ein Memory Mapped File zum Datenaustausch zwischen Windows Forms Anwendungen verwende geht es.
Ein von der Windows Forms Anwendung angelegtes Memory Mapped File scheint aber vom Windos Service nicht gefunden zu werden und umgekehrt. D.h. beide legen ihr eigenes an.Die Windows Forms Anwendungen laufen unter dem gerade angemeldetem Benutzer. Der Windows Service unter dem Local System Konto.
Danke, Markus
Antworten
-
Hallo Markus,
da Dienste in einer anderer Isolationsstufe laufen, musst Du "Global\Name der Datei" verwenden,
siehe Creating Named Shared MemoryUnd wenn der Dienst unter dem System-Konto läuft wirst Du zudem die Rechte festlegen müssen, dazu MemoryMappedFileSecurity.AddAccessRule-Methode
Ein Beispiel (C#) findet sich u. a. in: Inter-Process Communication using MemoryMappingFile
Gruß Elmar
- Als Antwort markiert Markus222 Montag, 10. September 2012 07:22
Alle Antworten
-
Hallo Markus,
da Dienste in einer anderer Isolationsstufe laufen, musst Du "Global\Name der Datei" verwenden,
siehe Creating Named Shared MemoryUnd wenn der Dienst unter dem System-Konto läuft wirst Du zudem die Rechte festlegen müssen, dazu MemoryMappedFileSecurity.AddAccessRule-Methode
Ein Beispiel (C#) findet sich u. a. in: Inter-Process Communication using MemoryMappingFile
Gruß Elmar
- Als Antwort markiert Markus222 Montag, 10. September 2012 07:22
-
Hallo Elmar,
ja. Mit "Global\Name der Datei" klappt der beschriebene Datenaustausch. Vielen Dank.
Da wäre noch etwas. Wenn der Windows Service eine Windows Forms Anwendung startet (mit System.Diagnostics.Process.Start(FilePath))
so läuft diese ebenfalls unter Local System. Das ist in dem Fall wünschenswert. Allerdings sehe ich dann das Form nicht auf dem Bildschirm?
-
Hallo Markus,
Dienste laufen unter einer eigenen Window Station, die isoliert vom Benutzer Station läuft - und Du bzw. der Anwender sieht das Fenster deswegen nicht.
Es ist generell keine gute Idee, das System Konto auf den Benutzer auszuweiten,
denn da "freut" sich jeder Virus und Trojaner.Wenn Du schon ein Memory Mapped File zur Kommunikation verwendest,
Gruß Elmar
so stoße das Erzeugen des Programms im Client an, dann passt sowohl die Station und die Rechte sind die des Anwenders. -
Hallo Elmar,
es ist immer noch die Anwendung zur Computerzeitbegrenzung. Habe nur sporadisch was daran gemacht. Besagter Schüler besucht die Schule auch zu Zeit.
Die Windows Forms Anwendung sollte dazu sein ein Passwort einzugeben um die Prozesse und Dienste dadurch zu beenden das "...Closed" an den Anfang des MemoryMappedFile geschrieben wird.Das Signal für die Windows Forms Anwendungen zu schliessen und für die Dienste zu warten bis wieder ein "...Running" am Anfang des besagten MMF steht. (Die Dienste haben Can Stop False.)
Und sie sollten dazu da sein die eigentliche Arbeit der Anwendung zu leisten um das ordentlich debuggen zu können.
Die Dienste starten automatisch beim Start von Windows (überwachen relevante Einstellungen in der Registry gegenseitig, installieren sich auch gegenseitig falls ein Dienst eben doch gefunden und deinstalliert wurde) und starten ihrerseits die Windows Forms Anwendungen.Eben mit besagtem User so dass die PW Eingabe nicht möglich ist. (Es geht auch ohne. Updates des Programms können über einen programmgesteuerten Setup erfolgen der mit entsprechenden Schreibrechten in das MMF läuft.)
Nur wie ist von einem Dienst eine Windows Forms Anwendung im Kontext des Benutzers denn zu starten? System.Diagnostics.Process.Start erlaubt in einer Überladung zwar einen Username aber verlangt laut Hilfe auch eine Active Directory Domain.
Das habe ich nicht ausprobiert. Das ganze ist etwas aufwendig. Wie ein Windows Service Debug geht weiss ich nicht. Geholfen habe ich mir mit Ausgaben in Dateien im Anwendungsverzeichnis solange Debug aktiv ist.
- Bearbeitet Markus222 Montag, 10. September 2012 19:23