Программно перезапустить службу Windows

Я знаю, что это можно сделать в С#/. Net, но мне было интересно, можно ли это сделать, вызвав Windows API?

У меня есть служба, которая будет обслуживать запросы DHCP, когда я хочу обновить конфигурацию службы, которую мне нужно остановить, перезаписать его INI файл и снова запустить службу.

Любая помощь оценивается!

Ответы

Ответ 1

  • Откройте диспетчер управления сервисом с помощью OpenSCManager.
  • Откройте службу, с которой вы хотите управлять, OpenService.
  • Используйте ControlService или ControlServiceEx с параметром SERVICE_CONTROL_STOP, чтобы остановите службу.
  • Сделайте все, что вам нужно.
  • Для перезапуска службы используйте StartService.
  • Используйте CloseServiceHandle, чтобы закрыть службу и SCM-дескрипторы.

Ответ 4

Вам нужно будет открыть диспетчер управления службами (OpenSCManager), а затем открыть сам сервис (OpenService) и, наконец, попросить его начать (StartService). Закройте все ручки, которые вы использовали по пути, а затем все готово.

Ничего себе, обработка сервисов на С++ действительно возвращает меня...

Удачи,

Ответ 5

В поле dos net start [service] будет делать то, что вам нужно. Если вы не найдете решение API, вы всегда можете запустить процесс для net.exe, используя start [service] в качестве параметров.

Ответ 6

Вы также можете использовать WMI. Образец кода по этой ссылке - VB, но его довольно легко переносить на любой язык в Windows.

Если вы используете автоматизацию в Windows, WMI хорошо учиться, потому что он обеспечивает объектно-ориентированный интерфейс, ориентированный на язык, для большинства интересных объектов в системе.

Ответ 7

Иногда вы хотите перезапустить службу из самой службы. Это решение сработало для меня. Я прояснил довольно простой код таймера для ясности. Обратите внимание, что это решение работает только потому, что вызывающий объект является сервисом и работает на повышенном уровне.

void Watchdog::OnTimeout()
{
    STARTUPINFO si = { };
    si.cb = sizeof(STARTUPINFO);
    GetStartupInfo(&si);

    PROCESS_INFORMATION pi = { };

    // is modified by the call to CreateProcess (unicode version).
    TCHAR szCmdLine[] = _T("cmd.exe /C \"net stop <yourservicenamehere> & net start <yourservicenamehere>\"");

    // send shell command to restart our service.
    if (!CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
    {
        // do some error reporting...
        LOG("*** ERROR *** Watchdog timeout.  Restart attempt failed. Last error: 0x%x\n", GetLastError());
    }
}

Ответ 8

Я опаздываю на вечеринку, но я бы предложил официальные подробные примеры для запуска и остановки службы. Преимущество над другими ответами здесь заключается в том, что они включают обработку ошибок, краевые случаи и зависимые сервисы -

Стоп: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686335(v=vs.85).aspx Начать: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686315(v=vs.85).aspx