这个很简单,我的一个程序中的一个模块,看看是不是你所需要的。// 服务相关操作
function ChangeServiceStatus(sMachine, ServiceExecuteName: String; StatusValue: DWORD): Boolean;
  function ExtractFileNameEx(Const S: String): String;
  Var
    I: Integer;
    T: String;
  begin
    Result := S;
    for I := 0 to Length(Result) -1 do begin
      T := T +Result[I +1];
      if FileExists(T) then begin
        Result := T;
        Break;
      end;
    end;
  end;{type
  TStartType = (stAutomatic, stManual, stDisabled);
  TStatus    = (ssStopped, ssStarting, ssStopping, ssRunning,
                ssContinuePending, ssPausePending, ssPaused);}
var
  i : integer;
  schm: SC_Handle;         // 服务控制管理句柄
  schs: SC_Handle;         // service handle
  lpServices : PEnumServiceStatus;
  lpServices_: PEnumServiceStatus;
  pcbBytesNeeded    : DWORD;      // 下一个缓冲所需字节
  lpServicesReturned: DWORD;      // 服务个数
  lpResumeHandle    : DWORD;      // 指向下个未读服务入口点
  lpServiceConfig   : PQueryServiceConfig;
  //lpServiceStatus   : TServiceStatus;  sServerName, sDisplayName: String;
  sStartName, sExecuteName: String;
  // fStatus: TStatus;
  // fStartType: TStartType;
begin
  Result := false;
  // connect to the service control manager
  schm := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_ALL_ACCESS);
  // if failure
  if schm <= 0 then
  begin
    CloseServiceHandle(schm);
    exit;
  end;  lpResumeHandle := 0;
  lpServices     := nil;
  repeat
    EnumServicesStatus(schm, SERVICE_WIN32, SERVICE_ACTIVE or SERVICE_INACTIVE,
      lpServices^, 0, pcbBytesNeeded, lpServicesReturned, lpResumeHandle);    GetMem(lpServices, pcbBytesNeeded);    if Not EnumServicesStatus(schm, SERVICE_WIN32, SERVICE_ACTIVE or SERVICE_INACTIVE,
      lpServices^, pcbBytesNeeded, pcbBytesNeeded, lpServicesReturned, lpResumeHandle) then
    begin
      FreeMem(lpServices);
      Break;
    end;    lpServices_ := lpServices;
    for i := 0 to lpServicesReturned -1 do
    begin
      sServerName  := PEnumServiceStatus(lpServices_)^.lpServiceName;
      sDisplayName := PEnumServiceStatus(lpServices_)^.lpDisplayName;      schs := OpenService(schm, PChar(sServerName),
        SERVICE_QUERY_CONFIG Or SERVICE_QUERY_STATUS);
      if schs <> 0 then
      begin
        lpServiceConfig := nil;
        QueryServiceConfig(schs, lpServiceConfig, 0, pcbBytesNeeded);        GetMem(lpServiceConfig, pcbBytesNeeded);
        if QueryServiceConfig(schs, lpServiceConfig, pcbBytesNeeded, pcbBytesNeeded) then
        begin
          {
          case lpServiceConfig.dwStartType of
            SERVICE_AUTO_START  : fStartType := stAutomatic;
            SERVICE_DEMAND_START: fStartType := stManual   ;
            SERVICE_DISABLED    : fStartType := stDisabled ;
          end;
          }          sStartName   := lpServiceConfig.lpServiceStartName;
          sExecuteName := lpServiceConfig.lpBinaryPathName;
          sExecuteName := ExtractFileNameEx(sExecuteName);
          if sExecuteName = ServiceExecuteName then
          begin
            FreeMem(lpServiceConfig);
            CloseServiceHandle(schs);
            ChangeServiceStatus_ChildModule(schm, sServerName, StatusValue);
            CloseServiceHandle(schm);
          end;
        end;
        FreeMem(lpServiceConfig);
        {
        if QueryServiceStatus(schs, lpServiceStatus) then
          case lpServiceStatus.dwCurrentState of
            SERVICE_STOPPED         : fStatus := ssStopped;
            SERVICE_START_PENDING   : fStatus := ssStarting;
            SERVICE_STOP_PENDING    : fStatus := ssStopping;
            SERVICE_RUNNING         : fStatus := ssRunning;
            SERVICE_CONTINUE_PENDING: fStatus := ssContinuePending;
            SERVICE_PAUSE_PENDING   : fStatus := ssPausePending;
            SERVICE_PAUSED          : fStatus := ssPaused;
          end;
         }
      end;
      CloseServiceHandle(schs);
      Inc(lpServices_);
    end;
    FreeMem(lpServices);
  until lpResumeHandle = 0;
  // close service control manager handle
  CloseServiceHandle(schm);
end;