280 likes | 465 Views
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.
E N D
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 Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf
Remote-Desktop-Clients Control: Mstscax.dll Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf
Der Desktop im Desktop Terminal Server Client Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf
Ein „Seamless Window“ Citrix MetaFrame Presentation Server Veröffentlichte Applikation Lokale Applikationen Client Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf
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
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
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
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
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
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
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
Schritt 1: Die Hülle Tritsch, Gorzas – So bohren Sie den Remote-Desktop-Client auf
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Development for Professionals! Development for Professionals!