Difference between revisions of "ServiceManager"
From Lazarus wiki
Jump to navigationJump to searchm (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). |
− | |||
Line 26: | Line 25: | ||
try | try | ||
try | try | ||
− | |||
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>