risposta-alla-domanda-sullo-sviluppo-web-bd.com

Il modo più semplice per riavviare il servizio su un computer remoto

Qual è il modo programmatico più semplice per riavviare un servizio su un sistema Windows remoto? Il linguaggio o il metodo non contano finché non richiede l'interazione umana.

53
T - M

A partire da Windows XP, è possibile utilizzare sc.exe per interagire con i servizi locali e remoti. Pianificare un'attività per eseguire un file batch simile a questo:

 sc \\ server stop service
sc \\ server start service 

Assicurarsi che l'attività venga eseguita con un account utente privilegiato sul server di destinazione.

psservice.exe dal Sysinternals PSTools avrebbe anche fatto il lavoro:

 psservice \\ server restart service 
94
Tomalak

DESCRIZIONE: SC è un programma a riga di comando utilizzato per comunicare con NT Service Controller e servizi . UTILIZZO: sc [comando] [nome servizio] ...

    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

ESEMPIO: sc avvia MyService

13
dkretz

Se non richiede l'interazione umana, il che significa che non ci sarà un'interfaccia utente che richiama questa operazione e presumo che si riavvii ad un intervallo prestabilito? Se si ha accesso alla macchina, si può semplicemente impostare un'attività pianificata per eseguire un file batch usando il buon vecchio NET STOP e NET START

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

o se vuoi diventare un po 'più sofisticato, puoi provare Powershell

5
kd7

Ci saranno così tanti casi in cui il servizio andrà in "interrompersi in sospeso". Il sistema operativo si lamenterà che è stato "Non è in grado di fermare il servizio xyz". Nel caso in cui si desideri essere assolutamente certi che il servizio venga riavviato, si dovrebbe invece interrompere il processo. Puoi farlo facendo quanto segue in un file bat

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

Per scoprire quale processo è associato al tuo servizio, vai su Gestione attività -> scheda Servizi -> Fai clic destro sul tuo servizio -> Vai a elaborare.

Si noti che questo dovrebbe essere un problema fino a quando non si comprende il motivo per cui il servizio deve essere riavviato in primo luogo. Dovresti cercare perdite di memoria, cicli infiniti e altre condizioni tali per cui il tuo servizio non ha risposto.

3
ambassallo

guarda a sysinternals per una varietà di strumenti per aiutarti a raggiungere questo obiettivo. psService, ad esempio, riavvierebbe un servizio su una macchina remota. 

2
Raz

A partire da Powershell v3, le sessioni PS consentono l'esecuzione di qualsiasi cmdlet nativo su una macchina remota

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

Vedi qui per ulteriori informazioni

1
ShaneC
  1. aprire il database del gestore controllo servizi utilizzando openscmanager
  2. ottenere un servizio dipendente utilizzando EnumDependService ()
  3. Arresta tutti i servizi dipendenti utilizzando ChangeConfig () inviando il segnale STOP a questa funzione se avviati
  4. interrompere il servizio effettivo
  5. Ottieni tutte le dipendenze dei servizi di un servizio
  6. Avvia tutte le dipendenze dei servizi utilizzando StartService () se vengono arrestati
  7. Inizia il servizio effettivo

Quindi il tuo servizio viene riavviato prestando attenzione a tutte le dipendenze.

1
Sumedh

Raccomando il metodo fornito da doofledorfer.

Se vuoi davvero farlo tramite una chiamata API diretta, guarda la funzione OpenSCManager . Di seguito sono riportate le funzioni di esempio per prendere un nome e un servizio della macchina e interromperli o avviarli.

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;
1
JosephStyons

Credo che PowerShell ora superi il comando "sc" in termini di semplicità:

Restart-Service "servicename"
0
Medos