Difference between revisions of "ServiceManager/es"

From Lazarus wiki
Jump to navigationJump to search
Line 5: Line 5:
  
 
<syntaxhighlight>program ServiceTest;
 
<syntaxhighlight>program ServiceTest;
// Check if a certain process is running.
+
// Chequea si un cierto proceso está corriendo.
 
{$mode objfpc}{$H+}
 
{$mode objfpc}{$H+}
 
uses
 
uses
Line 11: Line 11:
 
   SysUtils,
 
   SysUtils,
 
   ServiceManager,
 
   ServiceManager,
   JwaWinSvc {for services declarations};
+
   JwaWinSvc {para declaraciones de servicios};
  
 
function IsServiceRunning(ServiceName: string): boolean;
 
function IsServiceRunning(ServiceName: string): boolean;
   {description Checks if a Windows service is running}
+
   {Chequea  si un servicio Windows está corriendo)
 
var
 
var
 
   Services: TServiceManager;
 
   Services: TServiceManager;
 
   ServiceStatus: TServiceStatus;
 
   ServiceStatus: TServiceStatus;
 
begin
 
begin
   //Check for existing services
+
   //Chequea por la existencia de servicios.
   //equivalent to sc query <servicename>
+
   //equivalente a sc query <nombredeservicio>
 
   Services := TServiceManager.Create(nil);
 
   Services := TServiceManager.Create(nil);
 
   try
 
   try
 
     try
 
     try
 
       Services.Acces := SC_MANAGER_CONNECT; //Note typo in property.
 
       Services.Acces := SC_MANAGER_CONNECT; //Note typo in property.
       //We don't need more access permissions than this; by default
+
       //NO necesitamos más permisos de accesos que este; por defecto
       //the servicemanager is trying to get all access
+
       //servicemanager trata de obtener acceso total.
 
       Services.Connect; //Now connect with requested access level
 
       Services.Connect; //Now connect with requested access level
 
       Services.GetServiceStatus(ServiceName, ServiceStatus);
 
       Services.GetServiceStatus(ServiceName, ServiceStatus);
Line 41: Line 41:
 
       on E: EServiceManager do
 
       on E: EServiceManager do
 
       begin
 
       begin
         // A missing service might throw a missing handle exception? No?
+
         // ¿Puede un servicio perdido lanzar una excepción de handle perdido? ¿No?
 
       {LogOutput('Error getting service information for ' + ServiceName +
 
       {LogOutput('Error getting service information for ' + ServiceName +
 
         '. Technical details: ' + E.ClassName + '/' + E.Message);}
 
         '. Technical details: ' + E.ClassName + '/' + E.Message);}
Line 49: Line 49:
 
       on E: Exception do
 
       on E: Exception do
 
       begin
 
       begin
       {LogOutput('Error getting service information for ' + ServiceName +
+
       {LogOutput('Error obteniendo información de servicio para ' + ServiceName +
         '. Technical details: ' + E.ClassName + '/' + E.Message);
+
         '. Detalles técnicos: ' + E.ClassName + '/' + E.Message);
 
         }
 
         }
 
         Result := False;
 
         Result := False;
         raise; //rethrow original exception
+
         raise; //relanza excepción original.
 
       end;
 
       end;
 
     end;
 
     end;
Line 64: Line 64:
 
   ServiceToTest = 'SamSs';
 
   ServiceToTest = 'SamSs';
  
//Security Accounts Manager, should be running, at least on Vista
+
//Security Accounts Manager, debería estar corriendo, al menos en Vista
 
begin
 
begin
 
   WriteLn('Starting test for ' + ServiceToTest + ' service.');
 
   WriteLn('Starting test for ' + ServiceToTest + ' service.');

Revision as of 09:56, 24 July 2013

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).

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; //Now connect with requested access level
      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; //rethrow original exception
      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 + ' service is running');
  end
  else
  begin
    WriteLn('The ' + ServiceToTest + ' service is not running');
  end;
end.