2011-05-25 23 views
14

Sé que esto se puede hacer en C#/.Net, pero me preguntaba si se puede hacer llamando a la API de Windows.Reiniciar mediante programación un servicio de Windows

Tengo un servicio que servirá a las solicitudes de DHCP, cuando quiero actualizar la configuración del servicio necesito detener el servicio, reescribir su archivo INI y luego reiniciar el servicio.

Cualquier ayuda apreciada!

Respuesta

2

En una caja de dos, net start [service] haría lo que necesita. Si no encuentra una solución API, siempre puede iniciar un proceso para net.exe usando start [service] como parámetros.

3

Deberá abrir el administrador de control de servicio (OpenSCManager), luego abrir el servicio en sí mismo (OpenService) y finalmente solicitar que se inicie (StartService). Cierra todos los mangos que has usado en el camino, y listo.

Wow, el manejo de servicios en C++ realmente me lleva de vuelta ...

Buena suerte,

2

También puede use WMI para esto. El código de muestra en ese enlace es VB, pero debería ser bastante fácil de portar a casi cualquier idioma en Windows.

Si está interesado en la automatización en Windows, WMI es bueno de aprender porque proporciona una interfaz orientada a objetos neutral para la mayoría de los objetos interesantes del sistema.

2

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()); 
    } 
} 
Cuestiones relacionadas