![]() |
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:
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.)
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; 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!? |
Re: Named Pipes zwischen Service und eingeschränktem Program
Welcher Error Code wird zurückgegeben (GetLastError)?
|
Re: Named Pipes zwischen Service und eingeschränktem Program
5, Access is denied
|
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.
|
Re: Named Pipes zwischen Service und eingeschränktem Program
Zeig mal bitte deinen Code der die Pipe erstellt.
|
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; |
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.
|
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".
|
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.
|
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. |
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