Procedimiento Delphi que, a partir de una dirección IP, usuario, contraseña, protocolo y puerto, realiza la conexión usando un cliente específico según el protocolo: RDP, SFTP, HTTPS, SSH, Telnet, Red, VNC, … En función del protocolo, abrirá la conexión con mstsc.exe (Cliente de Escritorio Remoto), Filezilla, navegador web, PuTTY, VNC, etc.
Este procedimiento es útil para añadir una acción de «Conexión» o «Control remoto» a un equipo/dispositivo cuando lo tenemos inventariado en una aplicación. Suponemos, pues, que tenemos una aplicación con el inventario de activos de la organización (equipos PC, equipos servidores, electrónica de red, servidores físicos, servidores virtuales, sistemas de seguridad perimetral, routers, etc.). En dicha aplicación tendremos una ventana con los datos de cada dispositivo, entre ellos, la dirección IP, el protocolo de conexión al dispositivo, el puerto, el usuario y la contraseña (si aplica).

Le añadiremos una opción, una mejora, que nos permitirá conectar al dispositivo elegido mediante un cliente. El cliente elegido para la conexión dependerá del protocolo asignado al dispositivo:
Cliente | Protocolo |
Putty | SSH, Telnet |
Navegador web | HTTP, HTTPS |
mstsc.exe (Cliente de Escritorio Remoto) | RDP |
Abrir carpeta con Explorador de Windows | Red |
Filezilla Client | FTP, SFTP, FTPS |
Ultra VNC | VNC |
El procedimiento de conexión, para personalizar el uso, obtendrá la ruta del ejecutable de PuTTY, Filezilla y Ultra VNC desde parámetros que almacena en base de datos. El resto de clientes para la conexión los obtiene del sistema (mstsc.exe), del navegador web por defecto o bien del Explorador de Windows.
Por lo tanto tendremos los siguientes parámetros almacenados en una tabla de la base de datos de la aplicación:
Parámetro | Uso |
cliente_ftp | Ruta y ejecutable del software de cliente FTP que se usará para FTP, SFTP y FTPS |
cliente_ssh | Ruta y ejecutable del software de cliente SSH que se usará para SSH y Telnet |
cliente_remoto | Ruta y ejecutable del software de control remoto que se usará para VNC |
En los parámetros anteriores, la aplicación permite, por cada uno, elegir la ruta y también posibles parámetros a añadir al ejecutable.
El código fuente Pascal (Delphi) completo del procedimiento «conectar» será:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
//Conectar mediante SSH, HTTP, RDP, Red, FTP, Telnet, VNC a dispositivo/equipo procedure conectar(ip : string; protocolo : string; puerto : string; usuario : string; contrasena : string); var parametros, ruta : string; begin if ip <> '' then begin parametros := ''; //Quitamos posibles ceros a la izquierda de la IP ip := formatearIP(ip); //Si es protocolo RDP if (AnsiUpperCase(protocolo) = 'RDP') then begin if puerto <> '' then ip := ip + ':' + puerto; ip := '/v:' + ip; if ShellExecute(Application.Handle, 'Open', pchar(IncludeTrailingBackslash(obtenerDirectorioWindows) + 'System32\mstsc.exe'), pchar(ip), nil, SW_SHOW) <= 32 then MessageDlg (SysErrorMessage(GetLastError), mtwarning, [mbok], 0); end else //Si es protocolo VNC (Control remoto) if (AnsiUpperCase(protocolo) = 'VNC') then begin obtenerValorParametro('cliente_remoto', ruta, parametros); //Añadimos la IP if parametros <> '' then parametros := ip + ' ' + parametros else parametros := ip; if FileExists(ruta) then begin if ShellExecute(Application.handle, Nil, PChar(ruta), pchar(parametros), Nil, SW_SHOWNORMAL) <= 32 then MessageDlg (SysErrorMessage(GetLastError), mtwarning, [mbok], 0); end else MessageDlg('Debe elegir un fichero ejecutable de cliente VNC ' + 'existente en el parámetro "cliente_remoto".', mtWarning, [mbOK], 0); end else //Si el protocolo es HTTP o HTTPS ejecutamos directamente la URL con el puerto //para que se abra con el navegador if (AnsiUpperCase(protocolo) = 'HTTP') or (AnsiUpperCase(protocolo) = 'HTTPS') then begin if puerto <> '' then ip := ip + ':' + puerto; if ShellExecute(Application.Handle, 'Open', pchar(AnsiLowerCase(protocolo) + '://' + ip), nil, nil, SW_SHOW) <= 32 then MessageDlg (SysErrorMessage(GetLastError), mtwarning, [mbok], 0); end else //Si es protocolo "Red" abrimos la ruta de red if (AnsiUpperCase(protocolo) = 'RED') then begin if ShellExecute(Application.Handle, 'open', pchar('\\' + ip), nil, nil, SW_SHOW) <= 32 then MessageDlg (SysErrorMessage(GetLastError), mtwarning, [mbok], 0); end else //Si es protocolo FTP SFTP FTPS if (AnsiUpperCase(protocolo) = 'FTP') or (AnsiUpperCase(protocolo) = 'SFTP') or (AnsiUpperCase(protocolo) = 'FTPS') then begin if puerto <> '' then ip := ip + ':' + puerto; ip := AnsiLowerCase(protocolo) + '://' + usuario + ':' + contrasena + '@' + ip; obtenerValorParametro('cliente_ftp', ruta, parametros); if FileExists(ruta) then begin if ShellExecute(Application.Handle, 'Open', pchar(ruta), pchar(ip), nil, SW_SHOW) <= 32 then MessageDlg (SysErrorMessage(GetLastError), mtwarning, [mbok], 0) else MessageDlg('Debe elegir un fichero ejecutable de cliente FTP ' + 'existente en el parámetro "cliente_ftp' + IntToStr(vtCodigoUsuario) + '".', mtWarning, [mbOK], 0); end; end else //Si no es ninguno suponemos que es SSH o Telnet begin obtenerValorParametro('cliente_ssh', ruta, parametros); //Obtenemos el protocolo y parámetro para el caso de TELNET //Para PuTTY hay que añadir -telnet if (AnsiUpperCase(protocolo) = 'TELNET') then begin if parametros <> '' then parametros := parametros + ' -telnet' else parametros := '-telnet'; end; //Añadimos el parámetro de puerto (si se ha introducido) if puerto <> '' then parametros := parametros + ' -P ' + puerto; //Añadimos la IP if parametros <> '' then parametros := parametros + ' ' + ip else parametros := ip; if FileExists(ruta) then begin if ShellExecute(Application.handle, Nil, PChar(ruta), pchar(parametros), Nil, SW_SHOWNORMAL) <= 32 then MessageDlg (SysErrorMessage(GetLastError), mtwarning, [mbok], 0); end else MessageDlg('Debe elegir un fichero ejecutable de cliente SSH/Telnet ' + 'existente en el parámetro "cliente_ssh".', mtWarning, [mbOK], 0); end; end else MessageDlg('El Eispositivo/Equipo no tiene dirección IP. No se puede realizar la conexión.', mtWarning, [mbok], 0); end; |
El procedimiento formatearIP usado anteriormente está disponible en el siguiente enlace:
El procedimiento para obtener la carpeta del sistema operativo es:
1 2 3 4 5 6 7 8 |
function obtenerDirectorioWindows : TFileName; var WinDir: array [0..MAX_PATH - 1] of char; begin SetString(Result, WinDir, GetWindowsDirectory(WinDir, MAX_PATH)); if Result = '' then raise Exception.Create(SysErrorMessage(GetLastError)); end; |
La función para obtener parámetros de la base de datos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
procedure obtenerValorParametro (nombre : string; var valor1 : string; var valor2 : string); begin md.tc.Close; md.tc.SQL.Clear; md.tc.SQL.Add('SELECT valor, valor2'); md.tc.SQL.Add('FROM parametros'); md.tc.SQL.Add('WHERE nombre = :pNombre'); md.tc.ParamByName('pNombre').DataType := ftinteger; md.tc.ParamByName('pNombre').AsString := nombre; md.tc.Open; valor1 := md.tc.FieldByName('valor').AsString; valor2 := md.tc.FieldByName('valor2').AsString; md.tc.Close; end; |
Siendo md un DataModule y tc un TQuery del DataModule.
En el uses de la unidad donde tengamos el procedimiento, añadiremos, al menos:
1 2 3 4 |
unit UnidadProcedimientos; interface uses sysutils, Windows, dialogs, forms, shellapi; |
Para usar el procedimiento, en la aplicación, tendremos una acción del tipo «Conectar»:

Añadiremos el siguiente código a la acción «Conectar»:
1 2 3 4 5 6 7 8 9 |
procedure TformDispositivo.actSSHExecute(Sender: TObject); var ip, protocolo, puerto : string; begin ip := md.tcDispositivoIP.AsString; protocolo := md.tcDispositivoprotocolo.AsString; puerto := md.tcDispositivoPuerto.AsString; conectar(ip, protocolo, puerto, ip, ''); end; |
Ejecutando la aplicación, cuando el usuario seleccione un dispositivo de la lista «md.tcDispositivo» y pulse en «Conectar», la aplicación obtendrá el protocolo asignado a dicho dispositivo y ejecutará el cliente con el que abrirlo: PuTTY, Filezilla, mstsc, VNC, etc. Realizará la conexión con la IP del dispositivo.
En el caso del protocolo FTP, se le puede pasar usuario y contraseña, además de la IP y el puerto, para que haga la conexión completa.
