web-dev-qa-db-fra.com

Moyen le plus simple de redémarrer le service sur un ordinateur distant

Quelle est la méthode de programmation la plus simple pour redémarrer un service sur un système Windows distant? Le langage ou la méthode importent peu, dans la mesure où ils ne nécessitent pas d'interaction humaine.

53
T - M

À partir de Windows XP, vous pouvez utiliser sc.exe pour interagir avec des services locaux et distants. Planifiez une tâche pour exécuter un fichier de commandes similaire à ceci:

 sc \\ service d'arrêt du serveur
sc \\ service de démarrage du serveur 

Assurez-vous que la tâche est exécutée sous un compte d'utilisateur privilégié sur le serveur cible.

psservice.exe à partir de Sysinternals PSTools ferait également le travail:

 psservice \\ service de redémarrage du serveur 
94
Tomalak

LA DESCRIPTION: SC est un programme en ligne de commande utilisé pour communiquer avec le Contrôleur de service NT et services . USAGE: sc [commande] [nom du service] ...

    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

EXEMPLE: sc démarrer MyService

13
dkretz

Si cela ne nécessite pas d'interaction humaine, cela signifie qu'aucune interface utilisateur n'invoquera cette opération et je suppose qu'elle redémarrera à un intervalle défini? Si vous avez accès à la machine, vous pouvez simplement définir une tâche planifiée pour exécuter un fichier de traitement par lot en utilisant le bon vieux NET STOP et NET START

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

ou si vous voulez devenir un peu plus sophistiqué, vous pouvez essayer Powershell

5
kd7

Il y aura tellement de cas où le service entrera dans "arrêt en attente". Le système d'exploitation se plaindra qu'il était "incapable d'arrêter le service xyz". Si vous voulez vous assurer que le service est redémarré, vous devez plutôt arrêter le processus. Vous pouvez le faire en procédant comme suit dans un fichier bat

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

Pour savoir quel processus est associé à votre service, accédez au gestionnaire de tâches -> onglet Services -> Cliquez avec le bouton droit de la souris sur votre service -> Accéder au processus.

Notez que cela devrait être une solution de rechange jusqu'à ce que vous compreniez pourquoi votre service a dû être redémarré en premier lieu. Vous devez rechercher les fuites de mémoire, les boucles infinies et d’autres conditions semblables pour que votre service ne réponde plus.

3
ambassallo

regardez sysinternals pour une variété d’outils pour vous aider à atteindre cet objectif. psService, par exemple, redémarrerait un service sur une machine distante. 

2
Raz

À partir de Powershell v3, les sessions PS permettent d’exécuter toute applet de commande native sur une machine distante.

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

Voir ici pour plus d'informations

1
ShaneC
  1. ouvrir la base de données du gestionnaire de contrôle de service à l'aide de openscmanager
  2. obtenir un service dépendant en utilisant EnumDependService ()
  3. Arrêtez tous les services dépendants en utilisant ChangeConfig () en envoyant le signal STOP à cette fonction s'ils sont démarrés
  4. arrêter le service réel
  5. Obtenir toutes les dépendances de services d'un service
  6. Démarrer toutes les dépendances de services en utilisant StartService () si elles sont arrêtées
  7. Démarrer le service actuel

Ainsi, votre service est redémarré en prenant en charge toutes les dépendances.

1
Sumedh

Je recommande la méthode donnée par doofledorfer.

Si vous voulez vraiment le faire via un appel d'API direct, examinez la fonction OpenSCManager . Vous trouverez ci-dessous des exemples de fonctions permettant de prendre un nom d'ordinateur et un service, puis de les arrêter ou de les démarrer.

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

Je pense que PowerShell l'emporte maintenant sur la commande "sc" en termes de simplicité:

Restart-Service "servicename"
0
Medos