Home | Chi sono | Contattami
 

Progr. lineare

Delphi
 
Componenti
  Database
 
Miei articoli

Windows

Miei articoli 

 

Costruire un client per i Servizi Terminal


1. Tanto per cominciare

Spesso utilizzo i servizi terminal di Windows 2000/2003 Server e Windows XP; l' applicazione client è presente di default in Windows XP e Windows 2003 Server ma non in Windows 2000 ma niente problema: basta fare un salto all' url

http://www.microsoft.com/windowsxp/downloads/tools/rdclientdl.mspx

e la si può scaricare.

Bene bene, è proprio da qui che voglio partire: il file msrdpcli.exe, che installa il client per terminal server, contiene 2 file fondamentali: mstsc.exe e mstscax.dll, entrambi compiati nella system32. Il primo è l' eseguibile che ci consente l' apertura di una sessione terminal mentre il secondo è una dll in cui è implementato il controllo ActiveX MsRdpClient. Come prima cosa procediamo alla registrazione:

regsvr32 mstscax.dll
 

2. Familiarizziamo col controllo

Ok, ora vediamo di importare il controllo ActiveX in modo da averlo come componente nella paletta di Delphi

Come al solito:

  1. Component->Import ActiveX Control
  2. Seleziona "Microsoft Terminal Services Active Client 1.0 Type Library" --> verranno evidenziati 2 nomi di classi: TMsTscAx, TMsRdpClient
  3. Selezionare la cartella in cui verrà salvata la Unit di import e premere "Create Unit": ora hai creato la Unit di import
  4. Crea un Package (o al limite selezionane uno già esistente) e aggiungi la unit appena creata
  5. Compila il package: la paletta di Delphi conterrà (di default nel tab ActiveX se non ne è stato settato un' altro nella procedura di importazione) il componente TMsRdpClient
     

Bene, ora cominciamo a divertirci: creiamo un nuovo progetto e sbattiamoci sopra il componentino grafico appena creato;

le proprietà sono intuitive al massimo:

  • Server: è l' IP del server con cui vogliamo aprire una sessione terminal
  • UserName: definisce lo UserName da usare di default
  • ColorDepth: numero di bit usati per definire la risoluzione video

anche i metodi non richiedono certo Einstein al cubo

  • Connect: apro una sessione terminal
  • Disconnect: disconnetto la sessione (N.B. la disconnetto, non la chiudo, quindi rimane ancora aperta sul server) che è quello che succede quando clikko sulla croce in alto a destra nel client classico

Non resta che fare una prova e verificare la connessione.

3. Approfondiamo

Prendiamo in esame il sorgente della unit di import (MSTSCLib_TLP.pas è il nome di default)

(per opportunità non la stò a scrivere tutta)

TMsRdpClient = class(TOleControl) private ..... ..... ..... protected .... .... .... public ...... ...... property SecuredSettingsEnabled: Integer index 22 read GetIntegerProp; property SecuredSettings: IMsTscSecuredSettings read Get_SecuredSettings; property AdvancedSettings: IMsTscAdvancedSettings read Get_AdvancedSettings; property Debugger: IMsTscDebug read Get_Debugger; property AdvancedSettings2: IMsRdpClientAdvancedSettings read Get_AdvancedSettings2; property SecuredSettings2: IMsRdpClientSecuredSettings read Get_SecuredSettings2; property ExtendedDisconnectReason: TOleEnum index 103 read GetTOleEnumProp; published .... .... .... end;

Punterei l' attenzione sulla proprietà AdvancedSettings2 che è di tipo IMsRdpClientAdvancedSettings

3.1 IMsRdpClientAdvancedSettings

Tra le proprietà di IMsRdpClientAdvancedSettings troviamo le seguenti

property RedirectDrives: WordBool read Get_RedirectDrives write Set_RedirectDrives; property RedirectPrinters: WordBool read Get_RedirectPrinters write Set_RedirectPrinters; property RedirectPorts: WordBool read Get_RedirectPorts write Set_RedirectPorts; property RedirectSmartCards: WordBool read Get_RedirectSmartCards write Set_RedirectSmartCards;

Sono tutti valori booleani (TRUE o FALSE) e fanno riferimento appunto alla redirezione o meno di drive, stampanti, porte e smart card di default sono tutte FALSE, quindi se ad esempio voglio redirigere le stampanti nella sessione terminal, allora prima di chiamare il metodo Connect di TMsRdpClient, dovrò impostare a TRUE la proprietà RedirectPrinters della proprietà Advancedsettings2 di TMsRdpClient, ossia:

unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, MSTSCLib_TLB, StdCtrls; type TForm1 = class(TForm) MsRdpClient1: TMsRdpClient; btConnect: TButton; btDisconnect: TButton; procedure btConnectClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.btConnectClick(Sender: TObject); begin // MsRdpClient1.AdvancedSettings2.RedirectPrinters := TRUE; MsRdpClient1.Connect; end; end.

un'altra proprietà importante è la seguente

property RDPPort: Integer read Get_RDPPort write Set_RDPPort;

RDPPort consente di impostare la porta di ascolto del servizio terminal sul server con cui ci vogliamo connettere (nel caso che ne sia stata impostata una diversa da quella di default che è 3389). Ad esempio se sul server remoto si usa la porta 56789 allora prima di chiamare il metodo Connect, scriverò

MsRdpClient1.AdvancedSettings2.RDPPort := 56789;

Interessante è poi l' evento OnDisconnected di TMsRdpClient

procedure TForm1.MsRdpClient1Disconnected(Sender: TObject; discReason: Integer); begin /// end;

il paramtero discReason rappresenta il motivo della disconnessione e assume i valori specificati nella unit di import che sono i seguenti

const exDiscReasonNoInfo = $00000000; exDiscReasonAPIInitiatedDisconnect = $00000001; exDiscReasonAPIInitiatedLogoff = $00000002; exDiscReasonServerIdleTimeout = $00000003; exDiscReasonServerLogonTimeout = $00000004; exDiscReasonReplacedByOtherConnection = $00000005; exDiscReasonOutOfMemory = $00000006; exDiscReasonServerDeniedConnection = $00000007; exDiscReasonLicenseInternal = $00000100; exDiscReasonLicenseNoLicenseServer = $00000101; exDiscReasonLicenseNoLicense = $00000102; exDiscReasonLicenseErrClientMsg = $00000103; exDiscReasonLicenseHwidDoesntMatchLicense = $00000104; exDiscReasonLicenseErrClientLicense = $00000105; exDiscReasonLicenseCantFinishProtocol = $00000106; exDiscReasonLicenseClientEndedProtocol = $00000107; exDiscReasonLicenseErrClientEncryption = $00000108; exDiscReasonLicenseCantUpgradeLicense = $00000109; exDiscReasonLicenseNoRemoteConnections = $0000010A; exDiscReasonProtocolRangeStart = $00001000; exDiscReasonProtocolRangeEnd = $00007FFF;

non mi pare che ci sia bisogno di spiegargli in quanto il nome di ognuno è sufficientemente autoesplicativo

Per il resto basta armarsi di curiosità e buona volontà e testare tutte le altre proprietà, metodi ed eventi facendo riferimento alla unit di import.

 




 

 


 

 
 
Your Ad Here