Программно перезапустить службу Windows
Я знаю, что это можно сделать в С#/. Net, но мне было интересно, можно ли это сделать, вызвав Windows API?
У меня есть служба, которая будет обслуживать запросы DHCP, когда я хочу обновить конфигурацию службы, которую мне нужно остановить, перезаписать его INI файл и снова запустить службу.
Любая помощь оценивается!
Ответы
Ответ 1
Ответ 2
Конечно, существует целая группа функций API C, например, http://msdn.microsoft.com/en-us/library/ms682108%28v=vs.85%29.aspx.
Ответ 3
Вы ищете что-то вроде этого: Запуск и остановка сервисов?
Ответ 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