Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CreateMemFile und Service-Anwendung (https://www.delphipraxis.net/42752-creatememfile-und-service-anwendung.html)

Union 23. Mär 2005 11:52


CreateMemFile und Service-Anwendung
 
Ich will Memory Mapped Files für die Kommunikation zwischen einer Service-Anwendung und einem Agent (Client zur Steuerung des Service) verwenden. Dabei setze ich folgenden Code ein, jeweils identisch bei Service und Agent:
Delphi-Quellcode:
procedure CreateMemFile;
begin
   MemFile := CreateFileMapping($ffffffff, nil, PAGE_READWRITE, 0, SizeOf(TSharedData), 'FlexiCom');
   if MemFile = 0 then
   begin
      raise Exception.Create(GetErrTxt(GetLastError));
   end;
   SharedData := MapViewOfFile(MemFile, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TSharedData));

   if SharedData=nil then
   begin
      CloseHandle(MemFile);
      raise Exception.Create(GetErrTxt(GetLastError));
   end;

   SharedData^ := '';
end;
Starte ich zuerst den Service und dann den Agent, so erhalte ich eine Fehlermeldung "Zugriff verweigert" und das Memfile-Handle ist 0. Wenn ich zuerst den Agent starte und dann erst den Service, so funktioniert alles einwandfrei (auch der Datenaustausch, Lesen und Schreiben etc.).

Leider ist es in der Praxis ja genau umgekehrt - Beim Systemstart wird automatisch der Service gestartet und der Agent wird vom Benutzer bei Bedarf ausgeführt.

Was muss ich tun, damit der Agent die Berechtigung erhält, auf ein vom Service geöffnetes MMF zuzugreifen?

NicoDE 23. Mär 2005 12:07

Re: CreateMemFile und Service-Anwendung
 
Zitat:

Zitat von Union
Was muss ich tun, damit der Agent die Berechtigung erhält, auf ein vom Service geöffnetes MMF zuzugreifen?

Eine Sicherheitsbeschriebung für das MMF-Objekt bei dessen Erzeugung angeben.

Union 23. Mär 2005 12:12

Re: CreateMemFile und Service-Anwendung
 
Zitat:

Zitat von NicoDE
Zitat:

Zitat von Union
Was muss ich tun, damit der Agent die Berechtigung erhält, auf ein vom Service geöffnetes MMF zuzugreifen?

Eine Sicherheitsbeschriebung für das MMF-Objekt bei dessen Erzeugung angeben.

Und wie mache ich das genau? Wahrscheinlich brauche ich dafür einen TSecurityDescriptor als 2. Parameter. Aber wie erstelle ich den (aus der Beschreibung im WinApi-Helpfile werde ich nicht schlau).

NicoDE 23. Mär 2005 12:22

Re: CreateMemFile und Service-Anwendung
 
Zitat:

Zitat von Union
Und wie mache ich das genau?

Ich habe anno dazumal im Entwickler-Forum ein Beispiel aus dem Platform SDK übersetzt: RegKeyWithFullAccess.

Union 23. Mär 2005 22:38

CreateMemFile und Service-Anwendung [gelöst]
 
Zitat:

Zitat von NicoDE
Zitat:

Zitat von Union
Und wie mache ich das genau?

Ich habe anno dazumal im Entwickler-Forum ein Beispiel aus dem Platform SDK übersetzt: RegKeyWithFullAccess.

Ich habe es jetzt beim Erzeugen des MMF innerhalb der Service-Anwendung so gelöst:
Delphi-Quellcode:
procedure CreateMemFile;
var
   aSA : TSecurityAttributes;
   aSD : TSecurityDescriptor;
begin
   aSA.nLength := SizeOf(TSecurityAttributes);
   aSA.bInheritHandle := true;
   aSa.lpSecurityDescriptor := @aSd;
   
   InitializeSecurityDescriptor(aSa.lpSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);
   // Das ist die massgebliche Zeile, und hier der Parameter nil:
   // If this parameter is NULL, a NULL discretionary ACL is assigned to the security descriptor, allowing all access to
   // the object. The discretionary ACL is referenced by, not copied into, the security descriptor.
   SetSecurityDescriptorDacl(aSa.lpSecurityDescriptor, True, nil, False);

   MemFile := CreateFileMapping($ffffffff, @aSa, PAGE_READWRITE, 0, SizeOf(TSharedData), 'FlexiCom');
   if MemFile = 0 then
   begin
      raise Exception.Create(GetErrTxt(GetLastError));
   end;
   SharedData := MapViewOfFile(MemFile, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TSharedData));

   if SharedData=nil then
   begin
      CloseHandle(MemFile);
      raise Exception.Create(GetErrTxt(GetLastError));
   end;

   SharedData^ := '';
end;
Dadurch wird laut WinApi-Doku Vollzugriff für alle erteilt. Das ist in dem fall auch nicht weiter schlimm, da sich an dem Server, auf dem der Service läuft, eh nur admins anmelden dürfen.

Danke für die Hilfe!

NicoDE 24. Mär 2005 08:33

Re: CreateMemFile und Service-Anwendung [gelöst]
 
Zitat:

Zitat von Union
Dadurch wird laut WinApi-Doku Vollzugriff für alle erteilt.

Das ist korrekt, der so genannte NULL-DACL gibt allen Vollzugriff (wird zwar nicht empfohlen, aber ist die einfachste Art das Problem zu lösen).

nitschchedu 2. Nov 2006 08:54

Re: CreateMemFile und Service-Anwendung
 
Wollte mal fragen ob du mal den Code Posten kannst ? Will auch sowas machen eben. :mrgreen:

Union 2. Nov 2006 09:51

Re: CreateMemFile und Service-Anwendung
 
Der Code ist doch da...

nitschchedu 2. Nov 2006 13:08

Re: CreateMemFile und Service-Anwendung
 
Ich wollte das ganze mal im zusammenhang sehen beispiel Programme eben. Weil ich weiß nicht wie der Dienst drauf reagiert wenn du einen Stream sickst ?

nitschchedu 14. Mär 2007 15:51

Re: CreateMemFile und Service-Anwendung
 
Noch ne Frage wann bekommst du mit das in den Speicher geschireben wird ? Und zeig mir das Bsp. mal zusammen ! Und machst du irgendt wo auch OpenFileMapping() ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:30 Uhr.
Seite 1 von 2  1 2      

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