tagspaces tag files and windows windows-services

windows - tag - La forma más simple de reiniciar el servicio en una computadora remota



tag folders (9)

¿Cuál es la forma programática más fácil de reiniciar un servicio en un sistema Windows remoto? El lenguaje o el método no tienen importancia siempre que no requiera interacción humana.


  1. abrir la base de datos de administrador de control de servicio usando openscmanager
  2. obtener servicio dependiente usando EnumDependService ()
  3. Detenga todos los servicios dependientes utilizando ChangeConfig () enviando la señal STOP a esta función si se inician
  4. detener el servicio real
  5. Obtener todas las dependencias de servicios de un servicio
  6. Inicie todas las dependencias de servicios utilizando StartService () si se detienen
  7. Comience el servicio real

Por lo tanto, su servicio se reinicia teniendo cuidado de todas las dependencias.


A partir de Powershell v3, las sesiones de PS permiten que cualquier cmdlet nativo se ejecute en una máquina remota

$session = New-PSsession -Computername "YourServerName" Invoke-Command -Session $Session -ScriptBlock {Restart-Service "YourServiceName"} Remove-PSSession $Session

Vea aquí para más información


Creo que PowerShell ahora supera al comando "sc" en términos de simplicidad:

Restart-Service "servicename"


DESCRIPCIÓN: SC es un programa de línea de comando utilizado para comunicarse con los servicios y el controlador del servicio NT. USO: sc [comando] [nombre del servicio] ...

The option <server> has the form "//ServerName" Further help on commands can be obtained by typing: "sc [command]" Commands: query-----------Queries the status for a service, or enumerates the status for types of services. queryex---------Queries the extended status for a service, or enumerates the status for types of services. start-----------Starts a service. pause-----------Sends a PAUSE control request to a service. interrogate-----Sends an INTERROGATE control request to a service. continue--------Sends a CONTINUE control request to a service. stop------------Sends a STOP request to a service. config----------Changes the configuration of a service (persistant). description-----Changes the description of a service. failure---------Changes the actions taken by a service upon failure. qc--------------Queries the configuration information for a service. qdescription----Queries the description for a service. qfailure--------Queries the actions taken by a service upon failure. delete----------Deletes a service (from the registry). create----------Creates a service. (adds it to the registry). control---------Sends a control to a service. sdshow----------Displays a service''s security descriptor. sdset-----------Sets a service''s security descriptor. GetDisplayName--Gets the DisplayName for a service. GetKeyName------Gets the ServiceKeyName for a service. EnumDepend------Enumerates Service Dependencies. The following commands don''t require a service name: sc <server> <command> <option> boot------------(ok | bad) Indicates whether the last boot should be saved as the last-known-good boot configuration Lock------------Locks the Service Database QueryLock-------Queries the LockStatus for the SCManager Database

EJEMPLO: sc start MyService


Habrá tantos casos en que el servicio entrará en "detener pendiente". El sistema operativo se quejará de que "No se pudo detener el servicio xyz". En caso de que quiera asegurarse de que el servicio se reinicie, debe eliminar el proceso. Puedes hacer eso haciendo lo siguiente en un archivo bat

taskkill /F /IM processname.exe timeout 20 sc start servicename

Para saber qué proceso está asociado a su servicio, vaya al administrador de tareas -> pestaña Servicios -> haga clic con el botón derecho en su Servicio -> Ir a proceso.

Tenga en cuenta que esto debería funcionar hasta que descubra por qué su servicio tuvo que reiniciarse en primer lugar. Debería buscar fugas de memoria, bucles infinitos y otras condiciones similares para que su servicio no responda.


Recomiendo el método dado por doofledorfer.

Si realmente desea hacerlo a través de una llamada API directa, entonces mire la función OpenSCManager . A continuación hay ejemplos de funciones para tomar el nombre y el servicio de una máquina, y detenerlos o iniciarlos.

function ServiceStart(sMachine, sService : string) : boolean; //start service, return TRUE if successful var schm, schs : SC_Handle; ss : TServiceStatus; psTemp : PChar; dwChkP : DWord; begin ss.dwCurrentState := 0; schm := OpenSCManager(PChar(sMachine),Nil,SC_MANAGER_CONNECT); //connect to the service control manager if(schm > 0)then begin // if successful... schs := OpenService( schm,PChar(sService),SERVICE_START or SERVICE_QUERY_STATUS); // open service handle, start and query status if(schs > 0)then begin // if successful... psTemp := nil; if (StartService(schs,0,psTemp)) and (QueryServiceStatus(schs,ss)) then while(SERVICE_RUNNING <> ss.dwCurrentState)do begin dwChkP := ss.dwCheckPoint; //dwCheckPoint contains a value incremented periodically to report progress of a long operation. Store it. Sleep(ss.dwWaitHint); //Sleep for recommended time before checking status again if(not QueryServiceStatus(schs,ss))then break; //couldn''t check status if(ss.dwCheckPoint < dwChkP)then Break; //if QueryServiceStatus didn''t work for some reason, avoid infinite loop end; //while not running CloseServiceHandle(schs); end; //if able to get service handle CloseServiceHandle(schm); end; //if able to get svc mgr handle Result := SERVICE_RUNNING = ss.dwCurrentState; //if we were able to start it, return true end; function ServiceStop(sMachine, sService : string) : boolean; //stop service, return TRUE if successful var schm, schs : SC_Handle; ss : TServiceStatus; dwChkP : DWord; begin schm := OpenSCManager(PChar(sMachine),nil,SC_MANAGER_CONNECT); if(schm > 0)then begin schs := OpenService(schm,PChar(sService),SERVICE_STOP or SERVICE_QUERY_STATUS); if(schs > 0)then begin if (ControlService(schs,SERVICE_CONTROL_STOP,ss)) and (QueryServiceStatus(schs,ss)) then while(SERVICE_STOPPED <> ss.dwCurrentState) do begin dwChkP := ss.dwCheckPoint; Sleep(ss.dwWaitHint); if(not QueryServiceStatus(schs,ss))then Break; if(ss.dwCheckPoint < dwChkP)then Break; end; //while CloseServiceHandle(schs); end; //if able to get svc handle CloseServiceHandle(schm); end; //if able to get svc mgr handle Result := SERVICE_STOPPED = ss.dwCurrentState; end;


Si no requiere interacción humana, lo que significa que no habrá UI que invoque esta operación y supongo que se reiniciará en algún intervalo establecido. Si tiene acceso a la máquina, puede simplemente configurar una tarea programada para ejecutar un archivo por lotes usando un buen viejo NET STOP y NET START

net stop "DNS Client" net start "DNS client"

o si quieres ser un poco más sofisticado, puedes probar Powershell


mire sysinternals para obtener una variedad de herramientas que lo ayudarán a lograr ese objetivo. psService, por ejemplo, reiniciaría un servicio en una máquina remota.


A partir de Windows XP, puede usar sc.exe para interactuar con servicios locales y remotos. Programe una tarea para ejecutar un archivo por lotes similar a esto:

sc //server stop service sc //server start service

Asegúrese de que la tarea se ejecute en una cuenta de usuario con privilegios en el servidor de destino.

psservice.exe de Sysinternals PSTools también estaría haciendo el trabajo:

psservice //server restart service