Difference between revisions of "ServiceManager"

From Lazarus wiki
Jump to navigationJump to search
(Example for packages\fcl-extra\src\win\ServiceManager.pas)
 
Line 7: Line 7:
 
--[[User:BigChimp|BigChimp]] 10:27, 10 June 2011 (CEST)
 
--[[User:BigChimp|BigChimp]] 10:27, 10 June 2011 (CEST)
  
program ServiceTest;
+
program ServiceTest;
// Check if a certain process is running.
+
// Check if a certain process is running.
 
+
{$mode objfpc}{$H+}
{$mode objfpc}{$H+}
+
uses
 
+
  Classes,
uses
 
  Classes,
 
 
   SysUtils,
 
   SysUtils,
 
   ServiceManager,
 
   ServiceManager,
 
   JwaWinSvc {for services declarations};
 
   JwaWinSvc {for services declarations};
 
 
   function IsServiceRunning(ServiceName: string): boolean;
 
   function IsServiceRunning(ServiceName: string): boolean;
 
     {description Checks if a Windows service is running}
 
     {description Checks if a Windows service is running}
Line 65: Line 62:
 
     end;
 
     end;
 
   end;
 
   end;
 
+
const
 
 
const
 
 
   ServiceToTest = 'SamSs';
 
   ServiceToTest = 'SamSs';
 
   //Security Accounts Manager, should be running, at least on Vista
 
   //Security Accounts Manager, should be running, at least on Vista
begin
+
begin
 
   WriteLn('Starting test for ' + ServiceToTest + ' service.');
 
   WriteLn('Starting test for ' + ServiceToTest + ' service.');
 
   if IsServiceRunning(ServiceToTest) then
 
   if IsServiceRunning(ServiceToTest) then
Line 80: Line 75:
 
     WriteLn('The ' + ServiceToTest + ' service is not running');
 
     WriteLn('The ' + ServiceToTest + ' service is not running');
 
   end;
 
   end;
end.
+
end.

Revision as of 10:31, 10 June 2011

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.