ServiceManager/es

From Free Pascal wiki
Revision as of 08:44, 12 September 2016 by Jma sp (talk | contribs) (ServiceManager)

English (en) español (es)

ServiceManager

Bajo Windows existe un paquete extra (fcl-extra package) llamado ServiceManager.

El siguiente ejemplo chequea si está ejecutándose el servicio SamSs (Security Accounts Manager, que debería estar siempre arrancado). (equivalente en línea de mandatos de sc query samss).

Nombre de Servicio

Debes tener en cuenta que si desarrollas tu propio servicio utilizando el paquete Lazdaemon entonces el nombre que se le asigne a dicho servicio tiene su importancia. Mientras que los mandatos net start y net stop utilizan el servicio mostrar nombre, el mandato sc y el código que se muestra más abajo utilizan el nombre de servicio interno. El nombre mostrado es que el se tiene en la propiedad "Display Name" del elemento creado en los elementos DaemosDefs. El nombre del servicio es la propiedad "Name" de dicho elemento. El nombre mostrado es el que se muestra actualmente en la columna Name por medio del applet de MS services manager (services.msc). Vamos a utilizar el ejemplo para clarificar esto. Se asume que has escrito una aplicación servicio llamada myService.exe en la cual hay un elemento en DaemosDefs. El elemento tienen por nombre "MyServ" y la propiedad asociada "DisplayName" tiene el valor "Internal build service". Utilizando la línea de mandatos como administrador puedes:


program ServiceTest;
// Chequea si un cierto proceso está corriendo.
{$mode objfpc}{$H+}
uses
  Classes,
  SysUtils,
  ServiceManager,
  JwaWinSvc {para declaraciones de servicios};

function IsServiceRunning(ServiceName: string): boolean;
  {Chequea  si un servicio Windows está corriendo}
var
  Services: TServiceManager;
  ServiceStatus: TServiceStatus;
begin
  //Chequea por la existencia de servicios.
  //equivalente a sc query <nombredeservicio>
  Services := TServiceManager.Create(nil);
  try
    try
      Services.Acces := SC_MANAGER_CONNECT; //Note typo in property.
      //NO necesitamos más permisos de accesos que este; por defecto
      //servicemanager trata de obtener acceso total.
      Services.Connect; //Ahora conecta con el nivel de acceso requerido.
      Services.GetServiceStatus(ServiceName, ServiceStatus);
      if ServiceStatus.dwCurrentState = SERVICE_RUNNING then
      begin
        Result := True;
      end
      else
      begin
        Result := False;
      end;
      Services.Disconnect;
    except
      on E: EServiceManager do
      begin
        // ¿Puede un servicio perdido lanzar una excepción de handle perdido? ¿No?
      {LogOutput('Error getting service information for ' + ServiceName +
        '. Technical details: ' + E.ClassName + '/' + E.Message);}
        Result := False;
        raise; //relanza la excepción original.
      end;
      on E: Exception do
      begin
      {LogOutput('Error obteniendo información de servicio para ' + ServiceName +
        '. Detalles técnicos: ' + E.ClassName + '/' + E.Message);
        }
        Result := False;
        raise; //relanza excepción original.
      end;
    end;
  finally
    Services.Free;
  end;
end;

const
  ServiceToTest = 'SamSs';

//Security Accounts Manager, debería estar corriendo, al menos en Vista.
begin
  WriteLn('Starting test for ' + ServiceToTest + ' service.');
  if IsServiceRunning(ServiceToTest) then
  begin
    WriteLn('The ' + ServiceToTest + ' el servicio está corriendo');
  end
  else
  begin
    WriteLn('The ' + ServiceToTest + ' el servicio no está corriendo');
  end;
end.

Funciones, constantes y tipos:

function ServiceStateToString (AState: DWord): String

const ServiceTypes = Array [0..3] of Word

function ServiceTypeToString (AType: DWord): String

const StartErrors = Array [0..3] of DWord

const StartTypes = Array [0..4] of DWord

type TServiceDescriptor = record

type TServiceEntries = class (TOwnedCollection)

type TServiceEntry = class (TCollectionItem)

type TServiceManager = class (Tcomponent)

function ControlAceptedToString (AValue: DWord): String

type EServiceManager = class (Exception)

function IsInteractiveService (AType: DWord): Boolean