Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Servicios de Windows (https://www.clubdelphi.com/foros/showthread.php?t=60140)

jocey 22-09-2008 13:53:17

Servicios de Windows
 
Si, yo tengo un servidor con windows 2003 server como RAS y entonces pasado un tiempo este serviicio se bloquea y me deja a todos los clientes sin RAS, entonces cuando llego al trabajo me doy cuenta de que esta bloqueado, voy al administrador de servicio , lo reinicio y ya, entonces mi idea es que delphi haga una consulta al servicio, si esta bloqueado, lo reinicie.

Me explique bien, tendras algun ejemplo que me sirva, he visto varios y niguno trabaja.

Saludos de antemano Jocey

Neftali [Germán.Estévez] 22-09-2008 15:48:30

Parar un servicio y reiniciarlo es sencillo en Delphi; Es un tema que ya hemos tratado varias veces y además creo que hay algun truco en la sección de Trucos de clubDelphi donde podrás encontrar en código para hacerlo (sino en algun hilo ya se ha añadido).

En cuanto a saber si un servicio está bloqueado, creo que debes probar a hacer un programa que intente "consumir" de ese servicio; Si el resultado no es el esperado, actuar en consecuencia.

jocey 22-09-2008 16:08:42

Servicio con windows
 
Si, ya he encontrado dos trucos y ninguno me funciona.....

Neftali [Germán.Estévez] 22-09-2008 16:39:00

Deberías dar alguna explicación más. En mi caso tengo dos programas que utilizan ese código y funcionan perfectamente parando, arrancando y testeando el estado del servicio.
:confused::confused::confused:

jocey 22-09-2008 16:44:41

Servicio con windows
 
Eso es lo que necesito un programa que testee el servicio y lo arranque o reinicie en caso de que el servicio este detenido o bloqueado.... no se que mas puedo explicar.... si fueras tan amable.

Saludos

Neftali [Germán.Estévez] 22-09-2008 16:54:11

Cita:

Empezado por jocey (Mensaje 315502)
... y ninguno me funciona.....

Cita:

Empezado por jocey (Mensaje 315515)
.... no se que mas puedo explicar...

Podrías explicar ¿Qué es lo que no funciona? ¿Parar? ¿Arrancar? ¿Que te devuelva el estado?
¿No te compilan los trucos? ¿Sí compilan, pero no ejecutan?
¿Algun error?
¿No funcionan con tu servicio concreto o no funcionan con ninguno?
¿qué llamada estás haciendo? ¿Qué parrémetro pasas para identificar el servicio?
...

A eso me refería.

jocey 22-09-2008 17:05:42

Servicio con windows
 
No compilan, por ejemplo este
Código Delphi [-]
function iniciarServicio (sMachine, sService: String) : Boolean;
var
  schm,
  schs: SC_Handle;
  ss: TServiceStatus;
  psTemp: PChar;
  dwChkP: DWord;
begin
  ss.dwCurrentState := -1;
  schm := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_CONNECT);
  if (schm>0) then
  begin
    schs := OpenService(schm, PChar(sService), SERVICE_START or
      SERVICE_QUERY_STATUS);
    if (schs>0) then
    begin
      psTemp := nil;
      if (StartService(schs, 0, psTemp)) then
        if (QueryServiceStatus(schs, ss)) then
          while (SERVICE_RUNNING<>ss.dwCurrentState) do
          begin
            dwChkP := ss.dwCheckPoint;
            Sleep(ss.dwWaitHint);
            if (not QueryServiceStatus(schs, ss)) then
              Break;
            if (ss.dwCheckPoint < dwChkP) then
              Break;
          end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
  Result := SERVICE_RUNNING=ss.dwCurrentState;
end;

la parte sudbrayada en rojo, ojo, se que es un cardinal y el valor esta fuera de rango, ahora, asi estaba en el truco que encontre... esto es lo que me pasa

jocey 22-09-2008 17:12:19

Servicio con windows
 
en este si compila, pero el valor que le subrayo siempre esta en cero....

Código Delphi [-]
   procedure StartSrv(Nombre: String);
var
 ServiceControlManager: SC_HANDLE;
 Service: SC_HANDLE;
 ServiceStatus: SERVICE_STATUS;
 Argv: PChar;
begin
  ServiceControlManager:= OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
  if ServiceControlManager <> 0 then
  begin
    Service:= OpenService(ServiceControlManager,PChar(Nombre),SERVICE_ALL_ACCESS);
    if Service <> 0 then
    begin
      if QueryServiceStatus(Service, ServiceStatus) then
      begin
        if ServiceStatus.dwCurrentState <> SERVICE_RUNNING  then
        begin
          Argv:= nil;
          StartService(Service,0,Argv);
        end;
      end;
      CloseServiceHandle(Service);
    end;
    CloseServiceHandle(ServiceControlManager);
  end;
end;

entonces nunca entra, sale al final de la aplicacion...

Neftali [Germán.Estévez] 22-09-2008 17:29:19

¿Puedes poner con qué parámetros los llamas?
¿Cómo identificas el servicio?

jocey 22-09-2008 18:07:24

Servicio con windows
 
en el caso del segundo ejemplo que es el que más se me ajusta:

servicio : Enrutamiento y acceso remoto
llamada : StartSrv('Enrutamiento y acceso remoto');

el nombre del servicio lo saque de la consola services.msc.

Neftali [Germán.Estévez] 23-09-2008 08:42:28

Cita:

Empezado por jocey (Mensaje 315534)
en el caso del segundo ejemplo que es el que más se me ajusta:
servicio : Enrutamiento y acceso remoto
llamada : StartSrv('Enrutamiento y acceso remoto');

Si accedes a la consola de servicios y accedes a las propiedades de ese servicio deberías ver algo así:



Ahora prueba lo mismo que estás haciendo, pero con el Nombre del servicio, no con el nombre a mostrar; A ver qué resultado da.

Código Delphi [-]
StartSrv('RemoteAccess');

seoane 23-09-2008 09:01:15

Solo una reflexion ... que facil es decir que algo no funciona :)

Neftali [Germán.Estévez] 23-09-2008 12:49:57

Cita:

Empezado por seoane (Mensaje 315649)
...que facil es decir que algo no funciona

Bueno, iba a decir que al ser nuevo en el club (aunque veo que no lo es -con más 100 mensajes-) tal vez no conoce mucho a los integrantes.
De ser así, sabría que los "códigos" de Domingo -Seoane- no suelen fallar ("no funcionar"). ;);)

jocey 23-09-2008 13:06:01

Servicio con windows
 
Es verdad tienen razon, es mas facila decir que no funciona y esperar a que te lo haga otro, tendre mas precaucion para la proxima, Gracias


La franja horaria es GMT +2. Ahora son las 13:45:43.

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