Программно перезапустите службу Windows - PullRequest
15 голосов
/ 25 мая 2011

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

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

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

Ответы [ 8 ]

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

Конечно, есть целый набор функций C API, см., Например, http://msdn.microsoft.com/en-us/library/ms682108%28v=vs.85%29.aspx.

3 голосов
/ 09 сентября 2016

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

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());
    }
}
3 голосов
/ 23 января 2014

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

Останов: 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

3 голосов
/ 25 мая 2011

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

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

Удачи,

3 голосов
/ 25 мая 2011

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

2 голосов
/ 25 мая 2011

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

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

2 голосов
/ 25 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...