Freigeben über


Client-/Serveranwendungsrichtlinien

Client-/Serveranwendungen dürfen nicht davon ausgehen, dass eine einzelne Computerverbindung einer einzelnen Benutzersitzung entspricht. Dies ist ein Sonderfall des Problems, das unter IP-Adressen und Computernamen erläutert wird.

Um eine Client/Server-Verbindung eindeutig zu identifizieren, muss jedes Clientmodul einen eindeutigen Namen oder Bezeichner verwenden. Anwendungen können benannte Objekte oder Pipes, Sockets oder andere IPC-Methoden verwenden. Weitere Informationen finden Sie unter Kernelobjektnamespaces.

Damit remotedesktopdienste kompatibel sind, muss das Servermodul in einer Client-/Serveranwendung in der Lage sein, mehrere Clients zu verarbeiten, die über denselben Computer verbunden sind. Dazu muss das Servermodul Clientverbindungen über eine klar definierte globale Schnittstelle wie RPC oder Named Pipes akzeptieren. Server und Client müssen für jede Benutzersitzung einen anderen Kommunikationskanal aushandeln. Der Client muss eine Verbindung mit dem Server herstellen, indem Protokolle verwendet werden, die diese Art von Vorgang problemlos unterstützen, z. B. TCP/IP, wobei für jede Clientanwendung eine andere Socketverbindung verwendet werden kann.

Das Clientmodul kann die ProcessIdToSessionId-Funktion aufrufen, um den Bezeichner seiner Remotedesktopdienste-Sitzung abzurufen. Der Client verwendet dann eine Form der Interprozesskommunikation, um seinen Sitzungsbezeichner an das Servermodul zu übergeben. Die Client- und Servermodule können dann den Sitzungsbezeichner verwenden, um einen privaten Kommunikationskanal einzurichten. Beispielsweise kann das Servermodul einen Sitzungsbezeichner verwenden, um auf Objekte im Namespace der Sitzung für Kernelobjekte zuzugreifen.

Darüber hinaus kann das Servermodul den Sitzungsbezeichner in einem WTSQuerySessionInformation-Aufruf verwenden, um zusätzliche Informationen zum Client abzurufen. Das Servermodul kann auch den Sitzungsbezeichner in einem WTSSendMessage-Aufruf verwenden, um eine Nachricht auf dem Clientterminal anzuzeigen. Das Servermodul kann auch zwei Ereignisse erstellen, um die Clientverbindung mit und die Trennung von einer Sitzung zu überwachen. Dazu muss er jedoch auf dem Remotedesktopsitzungshostserver (RD-Sitzungshost) registriert sein. Weitere Informationen finden Sie unter Überwachen von Sitzungsverbindungen und Trennungen.

Eingabeaufforderungen für Benutzereingaben sind eine potenzielle Problemquelle für Client-/Serveranwendungen. Wenn ein Dienst beispielsweise die MessageBox-Funktion aufruft, wird das Meldungsfeld auf dem Desktop des RD-Sitzungshostservers und nicht auf dem Clientdesktop angezeigt. Um eine Nachricht auf einem Clientdesktop anzuzeigen, kann der Dienst die Funktion WtsSendMessage aufrufen. Alternativ kann der Dienst Eingaben vom Clientmodul anfordern, und das Clientmodul kann die Benutzeroberfläche anzeigen und die resultierende Eingabe zurück an den Dienst senden.

Prozesse, die aus mehreren Sitzungen erzeugt werden, können Daten unter Verwendung von shared memory-Blöcken an andere senden und von ihnen empfangen. Weitere Informationen finden Sie unter Erstellen von benanntem freigegebenem Arbeitsspeicher. Freigegebener Arbeitsspeicher kann unter den folgenden Bedingungen nicht verwendet werden:

  • Die Prozesse, die den Shared Memory-Block verwenden, wurden von mehreren Sitzungen ausgelöst.
  • Die Sitzungen verwenden dieselben Anmeldeinformationen für die Benutzerauthentifizierung.