Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Named Pipes zwischen Service und eingeschränktem Programm (https://www.delphipraxis.net/119717-named-pipes-zwischen-service-und-eingeschraenktem-programm.html)

CodeX 30. Aug 2008 12:06


Named Pipes zwischen Service und eingeschränktem Programm
 
Ich habe ein für mich beunruhigendes Problem.

Nachdem ich jetzt eine funktionierende Named-Pipes-Kommunikation zwischen einem Service (der hier u.a. als Pipes-Server dient) und einem normalen Programm (das sich als Client verbinden kann) implementiert habe, kommt mir der böse Verdacht auf, dass das nur funktioniert, wenn das Programm nicht unter einem eingeschränkten Benutzeraccount läuft.

Da das ganze so weit richtig funktioniert hat, poste ich mal nur die entscheidende Stelle im Code:

Delphi-Quellcode:
function TPipeClient.ProcessMsg(aMsg: RPIPEMessage): RPIPEMessage;
begin
  CalcMsgSize(aMsg);
  Result.Size := SizeOf(Result);
  if WaitNamedPipe(PChar(FPipeName), 10) then
    if not CallNamedPipe(
      PChar(FPipeName), @aMsg, aMsg.Size, @Result, Result.Size, Result.Size, 3000
    ) then
      MessageDlg('PIPE antwortet nicht.', mtError, [mbOK], 0)
    else
  else
    MessageDlg('PIPE ist nicht vorhanden.', mtError, [mbOK], 0);
end;
CallNamedPipe schlägt fehl, wenn das Programm mit eingeschränkten Rechten läuft und es kommt die Meldung 'PIPE antwortet nicht.'. (Wenn der Service/Server nicht aktiv ist, dann kommt die korrekte Meldung, dass die Pipe nicht vorhanden sei. Auch mit eingeschränkten Rechten wird also nocht erkannt, ob die Pipe vorhanden ist oder nicht.)

Kann man da irgendwas machen? Irgendwie fühle ich mich hier von Windows auf den Schlips getreten...
Es muss doch möglich sein, dass selbst ein eingeschränktes Programm noch über Pipes kommunizieren kann!?

Fridolin Walther 30. Aug 2008 13:05

Re: Named Pipes zwischen Service und eingeschränktem Program
 
Welcher Error Code wird zurückgegeben (GetLastError)?

CodeX 30. Aug 2008 13:25

Re: Named Pipes zwischen Service und eingeschränktem Program
 
5, Access is denied

Apollonius 30. Aug 2008 13:29

Re: Named Pipes zwischen Service und eingeschränktem Program
 
Dann hast du beim Erstellen der Pipe einen zu strengen Security Descriptor angegeben. Windows ermöglicht dir, zu entscheiden, wer mit der Pipe kommunizieren darf und wer nicht.

Fridolin Walther 30. Aug 2008 13:40

Re: Named Pipes zwischen Service und eingeschränktem Program
 
Zeig mal bitte deinen Code der die Pipe erstellt.

CodeX 30. Aug 2008 13:45

Re: Named Pipes zwischen Service und eingeschränktem Program
 
Hm, sind die Flags bei CreateNamedPipe jetzt zu streng?

Delphi-Quellcode:
procedure TPipeServer.StartUpServer;
begin
  try
    // Pipe bereits vorhanden?
    if WaitNamedPipe(PChar(FPipeName), 100 {ms}) then
      raise Exception.Create('PIPE bereits vorhanden.');

    // Pipe erstellen
    FHandle := CreateNamedPipe(
      PChar(FPipeName), PIPE_ACCESS_DUPLEX,
      PIPE_TYPE_MESSAGE or PIPE_READMODE_MESSAGE or PIPE_WAIT,
      PIPE_UNLIMITED_INSTANCES, SizeOf(RPIPEMessage), SizeOf(RPIPEMessage),
      NMPWAIT_USE_DEFAULT_WAIT, nil
    );

    // Pipe erstellt?
    if FHandle = INVALID_HANDLE_VALUE then
      raise Exception.Create('PIPE konnte nicht erstellt werden.');
  except
  end;
end;

Apollonius 30. Aug 2008 13:51

Re: Named Pipes zwischen Service und eingeschränktem Program
 
Als letzten Parameter solltest du einen Zeiger auf eine gültige SECURITY_ATTRIBUTES-Struktur angeben, in der du den Security Descriptor festlegen kannst.

Fridolin Walther 30. Aug 2008 13:58

Re: Named Pipes zwischen Service und eingeschränktem Program
 
Das sollte in diesem Falle nicht wirklich notwendig sein. Eine NULL DACL bedeutet "Zugriff für jeden".

Apollonius 30. Aug 2008 14:02

Re: Named Pipes zwischen Service und eingeschränktem Program
 
Ja, aber du musst unterscheiden zwischen DACL nil und Security Descriptor nil. Security Descriptor nil bedeutet Standard-Descriptor, und dieser ist bei Benutzer System glücklicherweise sehr restriktiv.

CodeX 30. Aug 2008 14:05

Re: Named Pipes zwischen Service und eingeschränktem Program
 
Kannst Du mir bitte ein Beispiel geben, wie ich das richtig machen muss?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:05 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz