Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2013, 02:01   #1
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию Запуск/остановка служб

Нашёл в инете функции остановки и запуска служб, сделал юнит

Код:
unit uSevices;

interface

uses
Windows, sysutils, WinSvc;

function ServiceGetStatus(sMachine, sService: string ): DWord;
function ServiceStart(aMachine, aServiceName: string ): boolean;
function ServiceStop(aMachine,aServiceName: string ): boolean;

implementation

function ServiceStart(aMachine, aServiceName: string ): boolean;
// aMachine ýòî UNC ïóòü, ëèáî ëîêàëüíûé êîìïüþòåð åñëè ïóñòî
var
  h_manager,h_svc: SC_Handle;
  svc_status: TServiceStatus;
  Temp: PChar;
  dwCheckPoint: DWord;
begin
  svc_status.dwCurrentState := 1;
  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
      temp := nil;
      if (StartService(h_svc,0,temp)) then
        if (QueryServiceStatus(h_svc,svc_status)) then
        begin
          while (SERVICE_RUNNING <> svc_status.dwCurrentState) do
          begin
            dwCheckPoint := svc_status.dwCheckPoint;
            Sleep(svc_status.dwWaitHint);
            if (not QueryServiceStatus(h_svc,svc_status)) then
              break;
            if (svc_status.dwCheckPoint < dwCheckPoint) then
            begin
              // QueryServiceStatus íå óâåëè÷èâàåò dwCheckPoint
              break;
            end;
          end;
        end;
      CloseServiceHandle(h_svc);
    end;
    CloseServiceHandle(h_manager);
  end;
  Result := SERVICE_RUNNING = svc_status.dwCurrentState;
end;


function ServiceStop(aMachine,aServiceName: string ): boolean;
// aMachine ýòî UNC ïóòü, ëèáî ëîêàëüíûé êîìïüþòåð åñëè ïóñòî
var
  h_manager, h_svc: SC_Handle;
  svc_status: TServiceStatus;
  dwCheckPoint: DWord;
begin
  h_manager:=OpenSCManager(PChar(aMachine),nil, SC_MANAGER_CONNECT);
  if h_manager > 0 then
  begin
    h_svc := OpenService(h_manager,PChar(aServiceName),
    SERVICE_STOP or SERVICE_QUERY_STATUS);
    if h_svc > 0 then
    begin
      if(ControlService(h_svc,SERVICE_CONTROL_STOP, svc_status))then
      begin
        if(QueryServiceStatus(h_svc,svc_status))then
        begin
          while(SERVICE_STOPPED <> svc_status.dwCurrentState)do
          begin
            dwCheckPoint := svc_status.dwCheckPoint;
            Sleep(svc_status.dwWaitHint);
            if(not QueryServiceStatus(h_svc,svc_status))then
            begin
              // couldn't check status
              break;
            end;
            if(svc_status.dwCheckPoint < dwCheckPoint)then
              break;
          end;
        end;
      end;
      CloseServiceHandle(h_svc);
    end;
    CloseServiceHandle(h_manager);
  end;
  Result := SERVICE_STOPPED = svc_status.dwCurrentState;
end;




function ServiceGetStatus(sMachine, sService: string ): DWord;
var
  h_manager, h_service: SC_Handle;
  service_status: TServiceStatus;
  hStat: DWord;
  h_svc: SC_Handle;
begin
  hStat := 1;
  h_manager := OpenSCManager(PChar(sMachine) ,nil, SC_MANAGER_CONNECT);
  if h_manager > 0 then
  begin
    h_svc := OpenService(h_manager,PChar(sService), SERVICE_QUERY_STATUS);
    if h_svc > 0 then
    begin
      if(QueryServiceStatus(h_svc, service_status)) then
        hStat := service_status.dwCurrentState;
      CloseServiceHandle(h_svc);
    end;
    CloseServiceHandle(h_manager);
  end;
  Result := hStat;
end;

end.
Получаю из ini файла имена служб и запускаю или останавливаю их

Код:
ToStartServices := ini.ReadBool('Services', 'NeedToStart', false);
    if ToStartServices then
    begin
      Services := Ini.ReadString('Services', 'StartServicesNames', '');
      for i := 1 to length(services) do
        if (services[i] <> ',') then ServiceName := ServiceName + services[i] else
        begin
          Richedit1.Lines.Add(ServiceName);
          if ServiceStart('', ServiceName) then
          begin
            RichEdit1.SelAttributes.Color := clGreen;
            Richedit1.Lines.Add(TimeAndDate + ' ' + ServiceName + ' Succesful started');
            RichEdit1.SelAttributes.Color := clgreen;
            try
              Richedit1.Lines.Add('Service ' + ServiceName + ' ' + (IntToHex(ServiceGetStatus('\\SERVER', ServiceName), 8)));
            except
            end;
          end
          else
          begin
            RichEdit1.SelAttributes.Color := clred;
            Richedit1.Lines.Add(TimeAndDate + ' ' + ServiceName + ' unseccesful started');
            RichEdit1.SelAttributes.Color := clred;
          end;
          servicename := '';
        end
    end;
Проблема в том, что функции не работают, не получается ни запустить и остановить хоть одну службу. Windows Server 2003 R2
Lauri вне форума Ответить с цитированием
Старый 18.01.2013, 13:50   #2
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Никто не подскажет?
Lauri вне форума Ответить с цитированием
Старый 18.01.2013, 21:32   #3
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Администраторские права у программы есть?

По-любому, вызывай RaiseLastOSError, если возвращаемые значения функций API свидетельствуют об ошибке. В MSDN пишется, что нужно вызывать GetLastError, а RaiseLastOSError вызывает GetLastError автоматически, после чего на основе кода получает текстовое сообщение об ошибке и возбуждает исключение.
Vapaamies вне форума Ответить с цитированием
Старый 20.01.2013, 05:48   #4
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

В свое время сильно интересовался этим вопросом. Все работает. Проверено.
Вложения
Тип файла: rar scm.rar (5.7 Кб, 157 просмотров)
Баламут вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Таймер. Запуск, остановка, считывание пройденного времени. Shukhrat C# (си шарп) 1 07.12.2012 21:07
Запуск и остановка дочерней программы? Mr.karpiks Общие вопросы Delphi 23 28.08.2012 18:22
Остановка служб. SanekIrk Win Api 5 23.10.2009 13:37
Конфигуратор служб Баламут Софт 3 18.03.2009 01:54
Управление потоками. Запуск, остановка, приоритет потока. metamfetamin Помощь студентам 5 11.11.2007 12:45