Difference between revisions of "ServiceManager/es"
From Free Pascal wiki
Jump to navigationJump to searchLine 1: | Line 1: | ||
− | + | 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). | ||
<syntaxhighlight>program ServiceTest; | <syntaxhighlight>program ServiceTest; |
Revision as of 10:48, 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;
// Check if a certain process is running.
{$mode objfpc}{$H+}
uses
Classes,
SysUtils,
ServiceManager,
JwaWinSvc {for services declarations};
function IsServiceRunning(ServiceName: string): boolean;
{description Checks if a Windows service is running}
var
Services: TServiceManager;
ServiceStatus: TServiceStatus;
begin
//Check for existing services
//equivalent to sc query <servicename>
Services := TServiceManager.Create(nil);
try
try
Services.Acces := SC_MANAGER_CONNECT; //Note typo in property.
//We don't need more access permissions than this; by default
//the servicemanager is trying to get all access
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
// A missing service might throw a missing handle exception? 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 getting service information for ' + ServiceName +
'. Technical details: ' + E.ClassName + '/' + E.Message);
}
Result := False;
raise; //rethrow original exception
end;
end;
finally
Services.Free;
end;
end;
const
ServiceToTest = 'SamSs';
//Security Accounts Manager, should be running, at least on 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.