Программный перезапуск службы Windows

#c #windows-services

#c #windows-services

Вопрос:

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

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

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

Ответ №1:

  1. Откройте диспетчер управления службами с помощью OpenSCManager.
  2. Откройте службу, которой вы хотите управлять, с помощью OpenService.
  3. Используйте ControlService или ControlServiceEx с параметром SERVICE_CONTROL_STOP, чтобы остановить службу.
  4. Делайте все, что вам нужно сделать.
  5. Используйте startService для перезапуска службы.
  6. Используйте CloseServiceHandle, чтобы закрыть дескрипторы службы и SCM.

Ответ №2:

Конечно, существует целая куча функций C API, смотрите, например http://msdn.microsoft.com/en-us/library/ms682108(v=vs.85).aspx.

Ответ №3:

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

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

    PROCESS_INFORMATION pi = { };

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

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

Ответ №4:

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

Остановка: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686335 (v = против 85).aspx Запустить: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686315 (v = против 85).aspx

Ответ №5:

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

Ответ №6:

Вы ищете что-то вроде этого: Запуск и остановка служб?

Ответ №7:

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

Вау, обработка служб на C действительно возвращает меня назад…

Удачи,

Ответ №8:

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

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