function ServiceStart(aMachine, aServiceName: String): Boolean;
// aMachine is
UNC path or local machine if empty
var
h_manager, h_svc: SC_Handle;
ServiceStatus: TServiceStatus;
dwCheckPoint: DWORD;
ServiceArgVectors : PChar ;
begin
h_manager := OpenSCManager(PChar(aMachine), nil,SC_MANAGER_CONNECT);
if h_manager > 0 then
begin
h_svc := OpenService(h_manager, PChar(aServiceName),
SERVICE_START or SERVICE_QUERY_STATUS);
if h_svc > 0 then
begin
if (StartService(h_svc, 0, ServiceArgVectors)) then { succeeded }
begin
if (QueryServiceStatus(h_svc, ServiceStatus))then
begin
while (SERVICE_RUNNING <> ServiceStatus.dwCurrentState)do
begin
dwCheckPoint := ServiceStatus.dwCheckPoint;
Sleep(ServiceStatus.dwWaitHint);
if (not QueryServiceStatus(h_svc,ServiceStatus)) then
// couldn't check status
break;
if (ServiceStatus.dwCheckPoint < dwCheckPoint)then
break;
end;
end;
end;
CloseServiceHandle(h_svc);
end;
CloseServiceHandle(h_manager);
end;
Result := (SERVICE_RUNNING = ServiceStatus.dwCurrentState);
end;