ServiceManager

From Lazarus wiki
Revision as of 10:27, 10 June 2011 by BigChimp (talk | contribs) (Example for packages\fcl-extra\src\win\ServiceManager.pas)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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.