1 / 28

So bohren Sie den Remote-Desktop-Client auf

Tec 06. So bohren Sie den Remote-Desktop-Client auf. Bernhard Tritsch, Jozsef Gorzas visionapp GmbH, Frankfurt/Main http://www.visionapp.de. Terminalserver-Konzepte. Konventionelle Clients. Terminalserver-Umgebung. RDP. Remote-Desktop-Clients. Control: Mstscax.dll.

thane
Download Presentation

So bohren Sie den Remote-Desktop-Client auf

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Tec 06 So bohren Sie den Remote-Desktop-Client auf Bernhard Tritsch, Jozsef Gorzas visionapp GmbH, Frankfurt/Main http://www.visionapp.de

  2. Terminalserver-Konzepte Konventionelle Clients Terminalserver-Umgebung RDP Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  3. Remote-Desktop-Clients Control: Mstscax.dll Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  4. Der Desktop im Desktop Terminal Server Client Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  5. Ein „Seamless Window“ Citrix MetaFrame Presentation Server Veröffentlichte Applikation Lokale Applikationen Client Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  6. Wie funktioniert das? • Es gibt zwei gängige Möglichkeiten um „Seamless Windows“ von entfernten Anwendungen zu erzeugen: • Das Fenster mit dem entfernten Desktop wird auf dem Client unsichtbar gemacht und nur die Kindfenster mit den Anwendungen werden angezeigt • Für jede gestartete entfernte Anwendung wird auf dem Client ein lokales Fenster mit der richtigen Größe aufgemacht und die Client Area der entfernten Anwendung hineinkopiert (Device Context Mapping – so macht das z.B. Citrix) Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  7. Desktop auf dem Client ist unsichtbar Probleme: Finden und Starten einer entfernten Anwendung Kontrolle der „Z-Order“ aller Fenster Modifikation der Shell auf dem Server Fenster mit entfernten Anwendungen haben ein anderes Look & Feel Local Local Remote Remote File Edit View File Edit View File Edit View File Edit View Local App Local App Remote App Remote App 1 – Unsichtbarer Desktop 14:57 2:57pm Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  8. Client öffnet lokale Fenster mit entferntem Inhalt Probleme: Finden und Starten einer entfernten Anwendung Kontrolle der lokalen Fenster mit entferntem Inhalten Massive Veränderung der Shell auf dem Server Verwaltung von „verwaisten“ Fenstern Local Local Local Remote File Edit View File Edit View File Edit View File Edit View Remote App Local App Local App Remote App 2 – Device Context Mapping 14:57 2:57pm Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  9. Virtual Channels Terminalserver RDP/ICA Kernfunktionalitäten Zusätzliche Funktionalitäten Virtual Channel Service(s) Virtual Channel Extension(s) Client Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  10. Warum interessiert uns das? • „Remote Desktops“ und „Seamless Windows“ sind doch ein Nischenthema... • Na ja, nicht ganz... • Terminalserver werden in sehr großen, aktuellen Projekten eingesetzt (bis zu 100.000 Benutzer) • Microsoft bettet immer mehr zugehörige Basistechnologien in seine Betriebssysteme • Die Kunden „schreien“ nach dieser Funktionalität • Seamless Windows können für ähnliche verteilte Anwendungsszenarien eingesetzt werden wie sie in Zukunft auch mit Avalon möglich sind... Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  11. Avalon und Seamless? Hä? visionapp Seamless Windows Framework File Edit Commands Tools Help TreeView Tab Page Area Status: Remote Application launched sucessfully from Server „Nostradamo“ in Tab Page „Remote“ Launch Control Remote Applications Remote Local Remote App 1 Remote App 2 Remote Application Module Local Applications Local App 1 Local App Group Application Data Favorites Application Management Settings Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  12. Jetzt aber: Implementierung • Die einzelnen Stufen einer Beispiel-Implementierung • Leere WinForm-Anwendung wird erzeugt, in der sämtliche weiteren Aktionen geschehen • Remote Desktop ActiveX Control wird eingebunden und wir können uns zum Server verbinden; Desktop startet • Elemente des entfernten Desktops werden ausgeblendet und eine Anwendung wird gestartet • Desktop wird „unsichtbar“ gemacht und wir starten eingebettete Anwendungen über virtuelle Kanäle (d.h. wir kontrollieren den Server) Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  13. Schritt 1: Die Hülle Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  14. Schritt 2: ActiveX • Referenz auf das ActiveX Control für den eingebetteten Remote Desktop Client // Declaration private AxMsRdpClient m_msTsc; ... // Creation in constructor m_msTsc = new AxMsRdpClient(); m_msTsc.Dock = DockStyle.Fill; Controls.Add(m_msTsc); ... // Connect in menuItemConn_Click() m_msTsc.Server = conForm.m_tbServerName.Text; m_msTsc.Connect(); Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  15. Schritt 3: Programmstart • Statt dem „normalen“ Desktop starten wir eine Anwendung // Connect in menuItemConn_Click() ... m_msTsc.SecuredSettings.StartProgram = conForm.m_tbAppName.Text; ... m_msTsc.Connect(); ... • Das war ein einfacher, aber sehr wichtiger Schritt: Eine alternative Shell Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  16. Schritt 4: Zwei Optionen • Mit Schritt 4 können wir in zwei verschiedene Richtungen gehen: • „Avalon“-Option: Eine kontrollierbare entfernte Anwendung wird eingebettet in die lokale Rahmenanwendung gestartet • „Seamless“-Option: Die lokale Rahmenanwendung wird so groß wie der Desktop und unsichtbar geschaltet. Die entfernten Anwendungen werden über ein Context Menü in einem System Tray Icon gestartet • Beide Optionen erfordern eine alternative Server-Shell und Zugriff auf das unmanaged WTS API (über Interop) Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  17. Schritt 4: WTS API (1) • Die Funktionen des WTS API sind in Wtsapi.h deklariert und nutzen die Wtsapi.lib (in Unmanaged Code) • In der Windows-Laufzeitumgebung sind die WTS-Funktionen (z.B. Virtual Channels) über Wtsapi32.dll aufrufbar • Die .NET-Klasse System.Runtime. InteropServices erlaubt die Einbindung der WTS-Funktionen in Managed Code Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  18. Schritt 4: WTS API (2) • Funktionen des WTS API • WTSVirtualChannelClose, VirtualChannelClose • VirtualChannelEntry (Client) • VirtualChannelInit, VirtualChannelInitEvent • WTSVirtualChannelOpen, VirtualChannelOpen • VirtualChannelOpenEvent • WTSVirtualChannelPurgeInput • WTSVirtualChannelPurgeOutput • WTSVirtualChannelQuery, WTSVirtualChannelRead • WTSVirtualChannelWrite, VirtualChannelWrite • ...und viele mehr wie z.B. WTSOpenServer Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  19. Schritt 4: Code-Schnipsel 1 • WTS API Wrapper [DllImport( "wtsapi32.dll", ExactSpelling=true, SetLastError=true )] private static extern IntPtr WTSVirtualChannelOpen( IntPtr hServer, Int32 SessionId, IntPtr pVirtualName ); public static IntPtr WTSVirtualChannelOpen( IntPtr hServer, WtsSession SessionId, String sVirtualChannelName ) { return WtsApiWrapper.WTSVirtualChannelOpen( (IntPtr)null, Convert.ToInt32( SessionId ), Marshal.StringToHGlobalAnsi(sVirtualChannelName) ); } Speicherfreigabe nicht vergessen! Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  20. Schritt 4: Interop • Einige Tipps und Tricks für Interop: • String-Parameter sollten mit dem IntPtr Typ statt dem String-Typ aufgerufen werden • Handles sind Ganzzahlwerte im Windows-API und sollten in .NET auch mit dem Datentyp IntPtr deklariert werden • Die Verwendung von Strukturen als Parameter erfordert besondere Vorsicht, um das Layout und die Ausrichtung der Sturkturelement beizubehalten • API-Funktion als Private aufrufen und zum Bereitstellen in einer Bibliothek in eine Public Methode verpacken Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  21. Schritt 4: Code-Schnipsel 2 • Die neue Shell (auf dem Server) public ADCShell() { m_processes = new ArrayList(); m_hChannel = WtsApiWrapper.WTSVirtualChannelOpen( (IntPtr)null,WtsApiWrapper.WtsSession.WTS_CURRENT_ SESSION, "ADC" ); m_staThread = new Thread(new ThreadStart(WaitForCommandThread)); m_staThread.IsBackground = true; // Start the thread. m_staThread.Start(); } Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  22. Schritt 4: Code-Schnipsel 3 • Verwaltung der Anwendungsprozesse: WaitForCommandThread WtsApiWrapper.WTSVirtualChannelRead( m_hChannel, ref message ); if( message.Length == 0 ) continue; Process process = new Process(); process.StartInfo.FileName = message; process.EnableRaisingEvents = true; process.Exited += new EventHandler(process_Exited); process.Start(); m_processes.Add( process ); Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  23. Schritt 4: Code-Schnipsel 4 • Anpassung des ActiveX Controls auf dem Client m_msTsc = new AxMsRdpClient(); m_msTsc.Dock = DockStyle.Fill; m_msTsc.OnChannelReceivedData += new IMsTscAxEvents_OnChannelReceivedDataEventHandler (m_msTsc_OnChannelReceivedData); m_msTsc.OnConnected += new EventHandler(m_msTsc_OnConnected); m_msTsc.OnDisconnected += new IMsTscAxEvents_OnDisconnectedEventHandler (m_msTsc_OnDisconnected); Controls.Add(m_msTsc); Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  24. Schritt 4: Code-Schnipsel 5 • Event Handlers auf dem Client private void RDPClientForm_Load(object sender, System.EventArgs e) { m_msTsc.ColorDepth = 24; m_msTsc.CreateVirtualChannels( "ADC" ); this.Visible = false; //Application.DoEvents(); } ... private void m_msTsc_OnConnected(object sender, EventArgs e) { m_menuItem_Connect.Enabled = false; m_menuItem_Launch_Application.Enabled = true; } Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  25. Detailprobleme • Welche grundsätzlichen Probleme müssen denn bei Seamless Windows noch beachtet werden? • Kontrolle von Startmenü, Taskliste, Task-Manager, Alt-Tab usw. • Farbverwaltung auf Client und Server • Beenden der Session nach Beenden der letzten Anwendung • Lastenverteilung inkl. Wiederfinden der Sessions • Kontrollserver bzw. Services mit allen Informationen über veröffentlichte Anwendungen • Authentifizierungsmethode (ggf. mit Pass-through Optionen oder Single Sign-on) Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  26. Fazit • Die Terminaldienste sind konzeptionell die „langweiligste“ Technologie, die man sich vorstellen kann • Sie erlauben jedoch interessante Systemerweiterungen, wenn sie „geschickt“ eingesetzt werden • Diese Technologie steht erst an ihrem Anfang und wird wohl in Avalon massiv weiterleben... Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  27. Links & Bücher • MSDN – Using Terminal Services: http://msdn.microsoft.com/library/en-us/termserv/termserv/using_terminal_services.asp • MSDN – Terminal Services Reference: http://msdn.microsoft.com/library/en-us/termserv/termserv/terminal_services_reference.asp • visionapp GmbH: http://www.visionapp.de; bernhard.tritsch@visionapp.de, jozsef.gorzas@visionapp.de • Bernhard Tritsch, „Microsoft Windows Server 2003 Terminaldienste“, Verlag: Microsoft Press http://mspress.microsoft.de/mspress/product.asp? sku=3%2D86063%2D656%2D1 • Windows Terminalserver Technologie – Zusätzliche Informationen über Terminalserver: http://www.wtstek.de Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf

  28. Development for Professionals! Development for Professionals!

More Related