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.
- abrir la base de datos de administrador de control de servicio usando openscmanager
- obtener servicio dependiente usando EnumDependService ()
- Detenga todos los servicios dependientes utilizando ChangeConfig () enviando la señal STOP a esta función si se inician
- detener el servicio real
- Obtener todas las dependencias de servicios de un servicio
- Inicie todas las dependencias de servicios utilizando StartService () si se detienen
- 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