scコマンドでWindows OSのサービスを確認/一覧/開始/停止する

連載目次

対象OS:Windows 7/Windows 8/Windows 8.1/Windows Server 2008 R2/Windows Server 2012/Windows Server 2012 R2



解説

 Windows OSの「サービス」とは、システムのバックグラウンドで動作している特別なプロセスのことで、ユーザーからの要求だけでなく、システム内の各コンポーネントからの要求に応じて稼働する。システムにもよるが、Windows OSの場合は常に数十から数百のサービスが動作している。

 サービスの状態を調べたり、設定を確認したりするには、管理ツールにある「サービス」というツールを使うか、タスクマネージャーの「サービス」タブを利用するのが一般的である。

 だがGUIが使えない場合や、サービスの状態や設定をリストにしておきたい場合は、コマンドラインで利用できるCUIのツールが便利である。Windows OSにはsc.exeというサービスの制御のツールが用意されている。本TIPSではこのsc.exeコマンドの基本的な使い方についてまとめておく。

設定方法

●scコマンドとは?

 「sc.exe」は、サービスの状態確認や作成、削除、管理を行うためのコマンドである。Windows XPやWindows Server 2003以降のOSでは標準コマンドとして用意されている。

 タスクマネージャーの[サービス]タブや、[管理ツール]の[サービス]ツールでは、サービスの状態を確認したり、サービスの開始や停止を行ったりすることができる。だが、サービスの作成や削除、設定変更などはscコマンドやPowerShell(の*-Serviceコマンドレット)などを使う必要がある。

 scコマンドの使い方は、引数なしでscを起動すると表示される。

※scコマンドの機能はWindows OSのバージョンアップごとに少しずつ強化されている。以下は全てWindows 8.1での実行例

C:¥>sc


説明:
        SC はサービス コントロール マネージャーやサービスと通信するために使用
        するコマンド ライン プログラムです。
使用法:
        sc <サーバー> [コマンド] [サービス名] <オプション1> <オプション2>...

        オプションの <サーバー> は "¥¥サーバー名" の形式です。


        「sc [コマンド]」と入力するとコマンドの詳細なヘルプが表示されます。
        コマンド一覧:
          query-----------サービスの状態を照会したりサービスの種類ごと
                          に状態を列挙したりします。
          queryex---------拡張されたサービスの状態を照会したりサービス
                          の種類ごとに状態を列挙したりします。
          start-----------サービスを開始します。
          pause-----------サービスに PAUSE 制御要求を送信します。
          interrogate-----サービスに INTERROGATE 制御要求を送信します。
          continue--------サービスに CONTINUE 制御要求を送信します。
          stop------------サービスに STOP 要求を送信します。
          config----------サービスの構成を変更します (恒久的)。
          description-----サービスの説明を変更します。
…(中略)…
例:
        sc start MyService

QUERY と QUERYEX コマンドのヘルプを表示しますか? [ y | n ]: y …ここで「y」と入力すると、さらにqueryとqueryexコマンドのヘルプが表示される。「y」以外だと終了する

QUERY と QUERYEX のオプション:


        クエリ コマンドにサービス名が続く場合、サービスの状態が戻されます。
        この場合、それ以上のオプションは適用されません。クエリ コマンドに
…(以下省略)…



 scには数多くのサブコマンドがあり、scに続けてサブコマンド名やパラメーターを指定する。各サブコマンドの使い方は、パラメーターなしで例えば「sc control」や「sc start」のようにすれば表示される。ただし「sc query」と「sc queryex」だけはパラメーターなしでも利用できるので、これらのヘルプを表示させたい場合は上の例のように、「sc」とだけ入力して、途中で「y」キーを押す。

●サービスの一覧の取得

 システムに登録されているサービスの一覧を取得するには、sc queryかsc queryexコマンドを使う。

C:¥>sc query …sc queryでサービスの一覧を表示させる

SERVICE_NAME: AeLookupSvc …サービス名。以後はこの名前でサービスを指定すること


DISPLAY_NAME: Application Experience …サービスを分かりやすく説明した表示名
        TYPE               : 20  WIN32_SHARE_PROCESS …サービスの内部的な種類
        STATE              : 4  RUNNING …サービスの現在の状態。これは現在実行中という意味
                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

SERVICE_NAME: Appinfo


DISPLAY_NAME: Application Information
        TYPE               : 20  WIN32_SHARE_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
…(以下省略)…



 sc queryexでは、サービスが実行中なら、そのPID(プロセスID番号)も表示するなど、いくらか多くの情報が表示される。

C:¥>sc queryex …sc queryでサービスの一覧を表示させる

SERVICE_NAME: AeLookupSvc …サービス名


DISPLAY_NAME: Application Experience …サービスの表示名
        TYPE               : 20  WIN32_SHARE_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 856 …実行中のサービスのプロセスID番号
        FLAGS              :

SERVICE_NAME: Appinfo


DISPLAY_NAME: Application Information
        TYPE               : 20  WIN32_SHARE_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 856
        FLAGS              :
…(以下省略)…



●特定のサービスの詳細な情報の取得

 sc queryやsc queryに限らず、scではコマンド名に続けて「サービス名(SERVICE_NAME)」を指定すると、そのサービスだけを操作対象にできる。このとき「表示名(DISPLAY_NAME)」を指定してもエラーとなる。また、ワイルドカード指定も利用できない。

 そのため必要なら、あらかじめ引数なしのsc queryコマンドやsc getkeynameコマンドで、正確なサービス名を調べておく。sc getkeynameは表示名からサービス名を取得するためのコマンドである。

C:¥>sc query "*Defender*" …ワイルドカードで指定してみる
[SC] EnumQueryServicesStatus:OpenService FAILED 1060:

指定されたサービスはインストールされたサービスとして存在しません。 …エラーになる

C:¥>sc query | find "DISP" | sort …サービスの一覧結果からfindとsortコマンドで表示名部分だけを抜き出してみる


DISPLAY_NAME: Application Information
DISPLAY_NAME: Background Intelligent Transfer Service
DISPLAY_NAME: Background Tasks Infrastructure Service
…(中略)…
DISPLAY_NAME: Windows Connection Manager
DISPLAY_NAME: Windows Defender Network Inspection Service
DISPLAY_NAME: Windows Defender Service …このサービスを調べてみたいとする
DISPLAY_NAME: Windows Driver Foundation - User-mode Driver Framework
DISPLAY_NAME: Windows Event Log
DISPLAY_NAME: Windows Firewall
DISPLAY_NAME: Windows Font Cache Service
DISPLAY_NAME: Windows Management Instrumentation
DISPLAY_NAME: Windows Media Player Network Sharing Service
DISPLAY_NAME: Windows Search
DISPLAY_NAME: WinHTTP Web Proxy Auto-Discovery Service
DISPLAY_NAME: Workstation

C:¥>sc query "Windows Defender Service" …サービスの表示名を指定してみる


[SC] EnumQueryServicesStatus:OpenService FAILED 1060:

指定されたサービスはインストールされたサービスとして存在しません。 …やはりエラーになる

C:¥>sc getkeyname "Windows Defender Service" …表示名からサービス名を取得する


[SC] GetServiceKeyName SUCCESS
名前 = WinDefend …これが求めるサービス名

C:¥>sc query windefend …サービス名を指定してsc queryしてみる

SERVICE_NAME: windefend …結果が正しく表示された


        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

C:¥>



 ちなみに同じサービスを[管理ツール]の[サービス]ツールで確認すると次のようになっている。

scr01管理ツールの「サービス」による表示
管理ツールの[サービス]で「Windows Defender Service(WinDefend)」サービスのプロパティを表示させたところ。
  (1)サービス名。scコマンドを使う場合は、この短い「サービス名」を指定すること(大文字/小文字の違いは無視される)。タスクマネージャーの[サービス]タブでは、「名前」欄にこれが表示されている。
  (2)サービスを分かりやすく説明する表示名。タスクマネージャーの[サービス]タブでは、「説明」欄にこれが表示されている。
  (3)サービスの詳細な説明。
  (4)サービスの実行プログラムパス。多くのサービスは「svchost.exe」を介して起動されているが、この画面例のように、そうでないものもある。
  (5)サービスの起動設定。重要な基幹サービスの場合は、ユーザーが設定を変更できないように保護され、淡色表示になっている。
  (6)サービスの現在の状態。

 サービスの説明や構成情報などを取得するには、sc qdescriptionやsc qcコマンドなどが利用できる。

C:¥>sc qdescription windefend …サービスの説明文の表示
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: windefend


説明:  マルウェアおよびその他の望ましくない可能性のあるソフトウェアからのユーザー保護に役立ちます …サービスの説明

C:¥>sc qc windefend …サービスの構成情報の取得


[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: windefend


        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 2   AUTO_START …起動設定
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : "C:¥Program Files¥Windows Defender¥MsMpEng.exe" …サービスの本体のプログラムパス
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : Windows Defender Service
        DEPENDENCIES       : RpcSs …依存するサービス
        SERVICE_START_NAME : LocalSystem

C:¥>



●サービスの開始と停止

 scコマンドを使ってサービスを開始もしくは停止するには「sc start <サービス名>」「sc stop <サービス名>」が利用できる(管理者権限のあるコマンドプロンプト上で実行すること)。ただしこのコマンドを使ってサービスを停止させる場合、依存するサービス(上の実行結果中の「DEPENDENCIES」参照)があるなら先にそれを手動で停止しておかないとエラーになる。また、これらのコマンドはサービスに開始や終了の“トリガーを送信するだけ”で、実際にサービスが開始/終了するまで待つようにはなっていない(非同期で動作するということ)。そのため、これらのコマンドはあまり使い勝手はよくない。

C:¥>sc stop lanmanworkstation …sc stopコマンドで「LanmanWorkstationサービス(ファイル共有のクライアントサービス)」を停止させてみる
[SC] ControlService FAILED 1051: …エラーとなって、停止できなかった

別の実行中のサービスが依存しているサービスにストップ コントロールが送信されました。 …エラーの理由。依存するサービスがまだある、という意味

C:¥>sc qc lanmanworkstation …サービスの構成情報を確認してみる


[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: lanmanworkstation


        TYPE               : 20  WIN32_SHARE_PROCESS
        START_TYPE         : 2   AUTO_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : C:¥Windows¥System32¥svchost.exe -k NetworkService
        LOAD_ORDER_GROUP   : NetworkProvider
        TAG                : 0
        DISPLAY_NAME       : Workstation …サービスの表示名
        DEPENDENCIES       : Bowser …依存しているサービス。先にこれらのサービスを停止しておかないと、sc stopコマンドではlanmanworkstationサービスを停止できない
                           : MRxSmb20
                           : NSI
        SERVICE_START_NAME : NT AUTHORITY¥NetworkService

C:¥>



 そこでサービスを開始させたり終了させたりしたい場合は、scコマンドの代わりに「net start <サービス名>」や「net stop <サービス名>」を使うとよい(パラメーターにはサービス名と表示名のどちらでも指定できる)。これらのコマンドでは、依存するサービスなどがあれば自動的に停止してくれる。ただしタイムアウト値には制限があるので(数十秒ほど)、起動や終了に長い時間かかるようなサービスではその応答を待たずに、コマンドプロンプトへ戻ってくることがある。

C:¥>net stop lanmanworkstation …net stopでサービスを停止させてみる
次のサービスは Workstation サービスに依存しています。
Workstation サービスを停止すると、これらのサービスも停止されます。

   Remote Desktop Configuration …依存するサービスがあれば、このように表示される


   Computer Browser

この操作を続行しますか? (Y/N) [N]: ^C …ここで[y]と入力すると自動的に依存するサービスを先に停止してくれる。が、ここでは、[Ctrl]+[C]で中断してみた

C:¥>net stop lanmanworkstation /yes …再実行してみる。「/yes」を付けると、確認入力なしで、自動的に依存するサービスを停止してくれる


次のサービスは Workstation サービスに依存しています。
Workstation サービスを停止すると、これらのサービスも停止されます。

   Remote Desktop Configuration …依存するサービス


   Computer Browser

Remote Desktop Configuration サービスを停止中です. …依存するサービスを自動停止中


Remote Desktop Configuration サービスは正常に停止されました。

Computer Browser サービスを停止中です. …もう1つのサービスも自動停止する


Computer Browser サービスは正常に停止されました。

Workstation サービスを停止中です. …Workstationサービスが停止した


Workstation サービスは正常に停止されました。

C:¥>net start lanmanworkstation …Workstationサービスを開始させてみる


Workstation サービスを開始します.
Workstation サービスは正常に開始されました。…Workstationサービスが起動した

C:¥>




 scコマンドにはこれ以外にもサービスを作成したり、構成を変更したりする機能があるが、それらについては今後別記事で紹介する。

Tech TIPS

Copyright© 1999-2015 Digital Advantage Corp. All Rights Reserved.