Difference between revisions of "ServiceManager"

From Free Pascal wiki
Jump to navigationJump to search
m (Last edit accidentally deleted a b from begin in program code.)
(Thanks to sven on the mailing list: fixed problem with access denied on unelevated command prompts in Vista+)
Line 2: Line 2:
  
 
Example that checks whether the SamSs (Security Accounts Manager; should always be running) service is running is below.
 
Example that checks whether the SamSs (Security Accounts Manager; should always be running) service is running is below.
(Command line equivalent sc query samss)
+
(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.
 
  
  
Line 26: Line 25:
 
   try
 
   try
 
     try
 
     try
      Services.Connect;
 
 
       Services.Acces := SC_MANAGER_CONNECT; //Note typo in property.
 
       Services.Acces := SC_MANAGER_CONNECT; //Note typo in property.
 
       //We don't need more access permissions than this; by default
 
       //We don't need more access permissions than this; by default
 
       //the servicemanager is trying to get all access
 
       //the servicemanager is trying to get all access
 +
      Services.Connect; //Now connect with requested access level
 
       Services.GetServiceStatus(ServiceName, ServiceStatus);
 
       Services.GetServiceStatus(ServiceName, ServiceStatus);
 
       if ServiceStatus.dwCurrentState = SERVICE_RUNNING then
 
       if ServiceStatus.dwCurrentState = SERVICE_RUNNING then

Revision as of 12:37, 4 October 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).


<delphi>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.</delphi>