sc - サービスを操作する
scコマンドは、Windows のサービスを操作するコマンドです。サービスとは、サインインしなくてもバックグラウンドで動き続けるプログラム(印刷、Windows Update、ネットワーク機能など)のことです。
scを使うと、サービスの状態確認、起動・停止、スタートアップの種類(自動・手動・無効)の変更をコマンドだけで行えます。GUI の「サービス」画面(services.msc)を開かなくても済むため、バッチファイルに組み込むのにも向いています。
scコマンドの基本構文
sc <コマンド> <サービス名> [オプション]
最初の引数に「何をするか」を指定し、続けて対象のサービス名を指定します。主なコマンドは次のとおりです。
| コマンド | 内容 |
|---|---|
sc query | サービスの状態を表示する |
sc qc | サービスの構成(起動の種類など)を表示する |
sc start | サービスを起動する |
sc stop | サービスを停止する |
sc pause | サービスを一時停止する |
sc continue | 一時停止したサービスを再開する |
sc config | サービスの構成(起動の種類など)を変更する |
sc create | 新しいサービスを登録する |
sc delete | サービスの登録を削除する |
Windows PowerShell(5.1)では、scがSet-Contentコマンドレットの別名(エイリアス)になっています。そのままsc query Spoolerと入力してもサービスは操作できないため、sc.exe query Spoolerのように拡張子まで入力してください。この記事のコマンドは、コマンドプロンプトで実行する前提で書いています。
サービス名と表示名
サービスには、services.mscで見える表示名(例:Print Spooler)とは別に、コマンドで指定するサービス名(例:Spooler)があります。scで指定するのはサービス名のほうです。
sc queryの結果に、サービス名(SERVICE_NAME)と表示名(DISPLAY_NAME)が並んで表示されるので、対応を確かめられます。
サービスの状態を確認する
サービス名を指定してsc queryを実行します。
sc query Spooler
STATEが現在の状態です。主な値は次のとおりです。
| STATE の値 | 意味 |
|---|---|
RUNNING | 実行中 |
STOPPED | 停止中 |
START_PENDING | 起動処理中 |
STOP_PENDING | 停止処理中 |
PAUSED | 一時停止中 |
サービス名を付けずにsc queryだけを実行すると、実行中のサービスが一覧で表示されます。停止中のものも含めて表示するには、state= allを指定します。
sc query type= service state= all
scのオプションは、type= serviceのように**=の直後に半角スペース**を入れる必要があります。type=serviceと続けて書くとエラーになります。=の前にはスペースを入れません。
一覧が長いときは、moreやfindと組み合わせると読みやすくなります。
sc query type= service state= all | find "SERVICE_NAME"
サービスの構成を確認する
sc qc(query config)で、起動の種類や実行ファイルのパスを確認できます。
sc qc Spooler
START_TYPEに起動の種類が、BINARY_PATH_NAMEにサービスの実行ファイルが表示されます。
サービスを起動・停止する
起動はsc start、停止はsc stopです。
sc start Spooler
sc stop Spooler
サービスの起動・停止・構成変更には、多くの場合管理者権限が必要です。通常権限のコマンドプロンプトで実行すると「アクセスが拒否されました(エラー 5)」となります。管理者として実行する方法は、関連記事を参照してください。状態の確認(sc query)は通常権限でもできます。
sc stopは停止の要求を送るだけで、停止が完了するのを待ちません。実行直後はSTOP_PENDINGと表示されることがあり、少し待ってからsc queryでSTOPPEDになったかを確かめます。
サービスを再起動する
scに再起動コマンドはないので、停止して起動し直します。停止の完了を待つためにtimeoutを挟みます。
@echo off
sc stop Spooler
timeout /t 3 /nobreak >nul
sc start Spooler
停止に時間がかかるサービスでは、3 秒では足りないことがあります。確実に待ちたいときは、後述の「状態を待つ」方法を使ってください。
net start/net stopとの違い
net start サービス名とnet stop サービス名でも、サービスを起動・停止できます。
net stop Spooler
net start Spooler
net stopは、サービスが停止するまで待ってから戻ります。また、そのサービスに依存している他のサービスも、確認のうえ一緒に停止します。単純に止めて起動したいだけならnetのほうが手軽で、状態の確認や構成の変更までしたいならscが向いています。
スタートアップの種類を変更する
sc configのstart=で、Windows 起動時の動作を変更できます。
sc config Spooler start= demand
| 指定値 | スタートアップの種類 |
|---|---|
auto | 自動 |
delayed-auto | 自動(遅延開始) |
demand | 手動 |
disabled | 無効 |
サービスを無効にすると、次回の起動以降、そのサービスに依存する機能が使えなくなります。仕組みが分からないサービスの構成は変更しないでください。変更前にsc qcで現在の設定をメモしておくと、元に戻せます。
エラーと対処法
scが失敗すると、[SC] OpenService FAILED 1060:のように、エラー番号付きのメッセージが表示されます。
| エラー番号 | 主な原因と対処 |
|---|---|
| 5 | アクセスが拒否された。管理者として実行する |
| 1056 | すでに起動している。sc queryで状態を確認する |
| 1060 | サービス名が存在しない。表示名ではなくサービス名を指定しているか確認する |
| 1058 | 無効になっているため起動できない。sc configで起動の種類を変更する |
| 1062 | サービスが開始されていない(停止済みのサービスを止めようとした) |
エラー番号の意味は、net helpmsg 1060のようにnet helpmsgで確認できます。
バッチファイルで状態を判定する
sc queryの出力をfindで検索すると、サービスが動いているかを判定できます。
@echo off
sc query Spooler | find "RUNNING" >nul
if errorlevel 1 (
echo Print Spooler は停止しています。
) else (
echo Print Spooler は実行中です。
)
findは一致する行があれば終了コード 0、なければ 1 を返すため、if errorlevel 1で「見つからなかった」場合を分岐できます。STATEの値は表示言語に影響されない英語表記なので、日本語環境でも同じ書き方で動作します。
状態を待つ
起動や停止の完了を待つには、状態が目的の値になるまで繰り返し確認します。
@echo off
sc stop Spooler >nul
:wait
sc query Spooler | find "STOPPED" >nul
if errorlevel 1 (
timeout /t 1 /nobreak >nul
goto wait
)
echo 停止しました。
サービスが停止できない状態だと、この例は永遠に待ち続けます。実用するときは、カウンター変数で最大回数を決めておくと安全です。
新しいサービスを登録・削除する
sc createで、自作のプログラムなどをサービスとして登録できます。binPath=には実行ファイルのパスを指定します。
sc create MyService binPath= "C:\tools\myservice.exe" start= demand
不要になったらsc deleteで登録を削除します。
sc delete MyService
sc deleteは確認なしでサービスの登録を削除します。Windows に標準で入っているサービスを削除すると、システムが正常に動作しなくなるおそれがあります。自分で登録したサービス以外には使わないでください。
なお、通常のプログラムやバッチファイルは、そのままではサービスとして動作しません。サービスとして登録するには、サービス制御マネージャーからの要求に応答できる実装が必要です。
まとめ
| やりたいこと | コマンド |
|---|---|
| サービスの状態を確認する | sc query サービス名 |
| すべてのサービスを一覧表示する | sc query type= service state= all |
| 起動の種類などの構成を確認する | sc qc サービス名 |
| サービスを起動する | sc start サービス名 |
| サービスを停止する | sc stop サービス名 |
| 起動の種類を変更する | sc config サービス名 start= demand |
| 実行中か判定する | sc query サービス名 | find "RUNNING" |
| サービスを登録・削除する | sc create / sc delete |