Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Iniciar y parar un servicio (https://www.clubdelphi.com/foros/showthread.php?t=80443)

seoane 08-06-2006 14:16:18

Iniciar y parar un servicio
 
Código Delphi [-]
uses WinSvc;

procedure StopService(Nombre: String);
var
 ServiceControlManager: SC_HANDLE;
 Service: SC_HANDLE;
 ServiceStatus: SERVICE_STATUS;
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_STOPPED  then
          ControlService(Service, SERVICE_CONTROL_STOP, ServiceStatus);
      end;
      CloseServiceHandle(Service);
    end;
    CloseServiceHandle(ServiceControlManager);
  end;
end;

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;

Ejemplo de uso:
Código Delphi [-]
  StartSrv('NombreDelServicio');
  StopService('NombreDelServicio');

Bicho 26-09-2006 18:01:33

Hola Domingo, no me funciona el truco.
Intento resetear un servicio en un pc remoto y aquí
ServiceControlManager:= OpenSCManager(<b>nil</b>, nil, SC_MANAGER_CONNECT);

Y en el primer nil lo substituyo por la IP del pc remoto y al preguntarle sobre el estatus funciona, pero cuando intenta acceder para detenerlo no.

Osea aquí:
Service:= OpenService(ServiceControlManager,PChar(Nombre),SERVICE_ALL_ACCESS);
if Service <> 0 then

Service siempre vale 0, incluso he probado a detener un servicio en mi pc, en local y ocurre lo mismo.

Alguna sugerencia?

Saludos y gracias


seoane 27-09-2006 01:32:23

Puede que sea un problema de permisos,¿intentaste acceder a los servicios desde la consola mmc?. Recuerda que hay que ser administrador para manejar los servicios, y que debes estar "logueado" como administrador en la maquina remota para poder modificar sus servicios.

Yo en el tema de permisos, suplantar usuarios, etc. estoy bastante verde, pero creo el tema anda por ahí. Prueba lo siguiente:

Código:

runas /netonly /user:Administrador tuprograma.exe
Donde "Administrador" es el nombre de usuario del administrador en la maquina remota. A continuación te preguntara el password y tu programa se iniciara, pero cuando intente conectarse al otro equipo lo hará como administrador. Si entonces te funciona el problema estaba en los permisos.

Bicho 27-09-2006 09:41:06

Hola Domingo, gracias por contestar,

Como te comenté, en local, no funciona tampoco. Desde la consola, puedo acceder y parar/iniciar... el servicio en cuestión. Y ahí es donde me extraña la cosa.

La solución que planteas probablemente funcione pero creo que voy a desestimar hacerlo. No me voy a arriesgar a resetetar un servicio remoto, habiendo tema de permisos y usuarios administradores de por medio. Si "casca" el servicio, que lo arreglen en sistemas o help desk, que para eso están.
Sólo lo quería para probar y ver si era factible de una manera sencilla.

Gracias de todos modos por tu ayuda

Saludos

Bicho 27-09-2006 10:03:42

Solo una cosa más. Es curioso ver como si me deja preguntarle al pc remoto en que estado está el servicio, y me devuelve el estado correcto: (iniciado, no disponible, detenido...), pero no me deja detenerlo/arrancarlo



La franja horaria es GMT +2. Ahora son las 08:04:33.

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