web-dev-qa-db-ja.com

リモートコンピューターでサービスを再起動する最も簡単な方法

リモートWindowsシステムでサービスを再起動する最も簡単なプログラム的な方法は何ですか?人間の相互作用を必要としない限り、言語や方法は関係ありません。

55
T - M

Windows XPでは、sc.exeローカルおよびリモートサービスと対話します。次のようなバッチファイルを実行するタスクをスケジュールします。

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

ターゲットサーバーで特権を持つユーザーアカウントでタスクが実行されることを確認します。

psservice.exeから Sysinternals PSTools も仕事をしています:

 psservice \\サーバー再起動サービス
95
Tomalak

説明:SCは、NT Service Controllerおよびサービスとの通信に使用されるコマンドラインプログラムです。使用法:sc [コマンド] [サービス名] ...

    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

例:sc start MyService

13
dkretz

人間の操作を必要としない場合、つまり、この操作を呼び出すUIが存在せず、一定の間隔で再起動すると想定されますか?マシンにアクセスできる場合は、古くなったNET STOPとNET STARTを使用して、スケジュールされたタスクを設定してバッチファイルを実行するだけで済みます。

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

または、もう少し洗練されたものにしたい場合は、 Powershell

5
kd7

サービスが「停止保留」に入るケースは非常に多くあります。オペレーティングシステムは、「サービスxyzを停止できません」と文句を言います。サービスを確実に再起動したい場合は、代わりにプロセスを強制終了する必要があります。これを行うには、batファイルで次のことを行います。

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

どのプロセスがサービスに関連付けられているかを確認するには、タスクマネージャに移動します-> [サービス]タブ->サービスを右クリックします-> [プロセスに移動]。

そもそもサービスを再起動する必要がある理由がわかるまで、これは回避策であることに注意してください。サービスが応答しなくなるためのメモリリーク、無限ループ、その他の条件を探す必要があります。

3
ambassallo

sysinternals を見て、その目標を達成するのに役立つさまざまなツールを探してください。たとえば、psServiceはリモートマシンでサービスを再起動します。

2
Raz

Powershell v3の時点では、PSsessionsにより、任意のネイティブコマンドレットをリモートマシンで実行できます。

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

詳細については here を参照してください

1
ShaneC
  1. openscmanagerを使用してサービスコントロールマネージャーデータベースを開く
  2. enumDependService()を使用して依存サービスを取得する
  3. ChangeConfig()を使用してすべての依存サービスを停止します(開始されている場合、この関数にSTOPシグナルを送信します)
  4. 実際のサービスを停止する
  5. サービスのすべてのサービス依存関係を取得する
  6. 停止している場合、StartService()を使用してすべてのサービスの依存関係を開始します
  7. 実際のサービスを開始

したがって、すべての依存関係に注意してサービスが再起動されます。

1
Sumedh

Doofledorferの方法をお勧めします。

直接API呼び出しを介して本当にやりたい場合は、 OpenSCManager関数 を見てください。以下は、マシン名とサービスを取得し、それらを停止または開始するサンプル関数です。

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

PowerShellはシンプルさの点で「sc」コマンドよりも優れていると思います。

Restart-Service "servicename"
0
Medos