ServiceManager

From Lazarus wiki
Revision as of 10:31, 10 June 2011 by BigChimp (talk | contribs)
Jump to navigationJump to search

For Windows, the fcl-extra package contains a unit called ServiceManager.

Example that checks whether the SamSs (Security Accounts Manager; should always be running) service is running is below. (Command line equivalent sc query samss) Note: I could only get this running using an elevated command prompt on Vista, which shouldn't be necessary.

--BigChimp 10:27, 10 June 2011 (CEST)

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.Connect;
       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.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.