Difference between revisions of "ServiceManager/es"
From Lazarus wiki
Jump to navigationJump to searchLine 5: | Line 5: | ||
<syntaxhighlight>program ServiceTest; | <syntaxhighlight>program ServiceTest; | ||
− | // | + | // Chequea si un cierto proceso está corriendo. |
{$mode objfpc}{$H+} | {$mode objfpc}{$H+} | ||
uses | uses | ||
Line 11: | Line 11: | ||
SysUtils, | SysUtils, | ||
ServiceManager, | ServiceManager, | ||
− | JwaWinSvc { | + | JwaWinSvc {para declaraciones de servicios}; |
function IsServiceRunning(ServiceName: string): boolean; | function IsServiceRunning(ServiceName: string): boolean; | ||
− | { | + | {Chequea si un servicio Windows está corriendo) |
var | var | ||
Services: TServiceManager; | Services: TServiceManager; | ||
ServiceStatus: TServiceStatus; | ServiceStatus: TServiceStatus; | ||
begin | begin | ||
− | // | + | //Chequea por la existencia de servicios. |
− | // | + | //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. | ||
− | // | + | //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.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 | ||
− | // | + | // ¿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 | + | {LogOutput('Error obteniendo información de servicio para ' + ServiceName + |
− | '. | + | '. Detalles técnicos: ' + E.ClassName + '/' + E.Message); |
} | } | ||
Result := False; | Result := False; | ||
− | raise; // | + | raise; //relanza excepción original. |
end; | end; | ||
end; | end; | ||
Line 64: | Line 64: | ||
ServiceToTest = 'SamSs'; | ServiceToTest = 'SamSs'; | ||
− | //Security Accounts Manager, | + | //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.