A veces desea reiniciar el servicio desde el propio servicio. Esta solución funcionó para mí. He omitido el código del temporizador bastante trivial para mayor claridad. Tenga en cuenta que esta solución solo funciona porque la persona que llama es un servicio y se ejecuta en un nivel elevado.
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());
}
}