連載
» 2004年03月13日 05時00分 UPDATE

Tech TIPS:Windowsのsvchost.exeプロセスとは? ―sc.exeでサービスをコマンドラインから制御する―

リッスンしているネットワーク・ポートを調べていると、svchost.exeというプロセスが所有者となっていることがよくある。svchost.exeは、ネットワーク関連の基本的なサービスを起動するための親となるプロセスであり、いくつかのグループに分けてサービスを起動している。scコマンドを使うと、サービスをコマンド・プロンプトから制御することができる。

[打越浩幸,デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows 2000 Professional/Windows XP Professional/Windows XP Home Edition/Windows 2000 Server/Windows 2000 Advanced Server



解説

 ネットワーク・アプリケーションがリッスン(待ち受け)しているTCP/UDPポートを調べるには、コマンド・プロンプト上で「netstat -a」というコマンドを利用することが多い。具体的な方法についてはすでに「TIPS:netstatでリッスンしているプロセスを特定する」で紹介している。そこではさらに、リッスンしているポートが実際にどのプロセスによってサービスされているかを調べる方法についてもいくつか解説している。

 その中で「svchost.exe」というプロセスが多くのネットワーク・サービスを担っているということを説明した。本TIPSでは、このプロセス自体について解説する。また、サービスを制御するためのコマンド(sc.exe)についても、その使い方を解説する。

svchostが多数実行されているタスク・マネージャの画面 svchostが多数実行されているタスク・マネージャの画面
タスク・マネージャで確認すると、svchost.exeというプロセスが多数動作しており、場合によってはCPU負荷が高くなっていたり、メモリを大量に消費していることがある。svchost.exeはサービスを起動するための元となるプロセスであり、OSのバージョンなどにもよるが、このように複数実行されているのが普通である。これはWindows XP Professionalにおけるタスク・マネージャの例。
  (1)この例では、6つ動作している。

操作方法

●svchost.exeプロセスとは? 

 svchost.exeは、OS内の各種サービスを起動するための親となるプロセスである。OS起動時には、svchost.exeを経由して、各種のネットワーク・サービスが起動するようになっている。svchost.exeが起動するサービスは、レジストリの以下のキーに記述されている。

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost



 実際のレジストリ設定を見ると、次のようにグループごとにサービスが分類されていることが分かる。これは、あるWindows XP Professionalマシンにおける例である。

svchost.exeに関するレジストリ設定 svchost.exeに関するレジストリ設定
svchost.exeによって起動されるサービスは、このレジストリに記述されている。このレジストリを調査することにより、svchost.exeがリッスン元となっているサービスは、これらのいずれかであることが分かる。これはWindows XP Professionalマシンでの例。
  (1)レジストリの位置。
  (2)SvcHostから起動されるサービスはSvcHostキーの下に、グループ別にまとめられて記述されている。
  (3)サービスのグループ。これらのグループごとにまとめてサービスが起動される。ここにはimgsvc〜termsvcsまで6つのグループがある。
  (4)グループに含まれるサービス。
  (5)例えばnetsvcグループには、6to4、AppMgmt、AudioSrv、……などのサービスが含まれ、これらはまとめて1つのグループとして同時に起動させられることになる。

 svchost.exe経由で起動するサービスには多くのものがあるが、このように、いくつかのグループに分かれている。そして同一グループに所属するサービスは、同時に起動することになる。例えば上の画面の例では、「imgsvc」「LocalService」「netsvcs」「NetworkService」「rpcss」「termsvcs」という6つのグループが存在している。どのサービスをどのグループに含めるのかは、サービスの設計者が決めることであり、システム内部の相互の関係や、デバッグや管理のしやすさなどに基づいて決められている(OSのバージョンによっても、同じサービスでもグループ分けが異なる場合がある)。

●グループ化されたサービスの起動

 サービスの起動はグループ単位で行われる。例えば「svchost -k netsvc」とすれば、netsvcグループに含まれるサービスが(自動起動するように設定されていれば)起動する。つまり、グループごとに異なるsvchost.exeのインスタンス(プロセス)が作成されるのである。このような事情があるため、実際のプロセスの状態を調べると、複数のsvchost.exeが起動しているように見える。実際のsvchost.exeプロセスとサービスの関係を調べるには、次のようなコマンドを実行する。

C:\>tasklist /fi "imagename eq svchost.exe" /svc

イメージ名                   PID サービス
========================= ====== =============================================
svchost.exe                 1304 RpcSs
svchost.exe                 1440 AppMgmt, AudioSrv, BITS, CryptSvc, Dhcp,
                                 dmserver, ERSvc, EventSystem, helpsvc,
                                 HidServ, lanmanserver, lanmanworkstation,
                                 Messenger, Netman, Nla, RasMan, Schedule,
                                 seclogon, SENS, ShellHWDetection, srservice,
                                 TapiSrv, TermService, Themes, TrkWks,
                                 uploadmgr, W32Time, winmgmt, wuauserv, WZCSVC
svchost.exe                 1612 Dnscache
svchost.exe                 1648 Alerter, LmHosts, RemoteRegistry, SSDPSRV,
                                 WebClient
svchost.exe                 1184 stisvc



 これはWindows XPおよびWindows Server 2003に用意されているtasklist.exe(タスクの一覧を表示させるコマンド)を使った例である。「/fi "imagename eq svchost.exe"」はsvchost.exeプロセスに関する情報だけを表示させる指定、「/svc」はサービスの情報を表示させる指定である。これにより、複数起動されているsvchost.exeプロセスと、各インスタンスのサービスの名称を知ることができる。

 Windows 2000の場合は、サポート・ツール(インストールCD-ROMの\SUPPORT\TOOLSフォルダに含まれるツール集)に含まれるtlist.exeを使えば同様の情報を知ることができる。ただし「/fi(フィルタ)」オプションは存在しないので、「tlist -s | find "svchost.exe"」を実行すればよいだろう。「-s」はサービスに関する情報を表示する指定である。

 以上のようにしてプロセスのID(PID)とそのサービスの関係が分かれば、どのサービス(グループ)がどのポートでリッスンしているかを、大ざっぱではあるが把握することができる。あとは必要ならば、サービスを1つずつ停止したり、起動設定を変更したりしながら調査すればよいだろう。詳細については「TIPS:netstatでリッスンしているプロセスを特定する」を参照していただきたい。ただしサービス名だけでは何のサービスかがよく分からないことが多いので、サービスの設定を変更するためには、そのサービスについてさらに調査する必要がある。

●サービス名からその詳細を調査する

 それぞれのサービスは、「サービス名」と「表示名」という2つの「名前」を持っている。「サービス名」とは、上のtasklist.exeコマンドの結果などで表示されている、サービスを表す短い略称である(サービスが含まれている実行ファイル名ではない)。例えば一番上の行に表示されている「RpcSs」はサービス名であり、このサービスの表示名は正式には「Remote Procedure Call (RPC)」という。

 OS内部では、サービスはすべてこのサービス名で管理されている。例えば各サービスに関するパラメータは、レジストリの「HKLM\SYSTEM\CurrentControlSet\Services」の下にサービス名のキーが作られ、そこに記録されている。

サービスに関するレジストリ・パラメータ サービスに関するレジストリ・パラメータ
各サービスに関する情報は、レジストリの「HKLM\SYSTEM\CurrentControlSet\Services」以下にサービス名をキーとして作られ、そこに格納されている。これはRpcSsサービスの例。
  (1)サービスに関するレジストリの位置。
  (2)RpcSsサービスの情報を表示させている。このキー名が「サービス名」になっている。
  (3)これがサービスの「表示名」。
  (4)サービスの説明。これを見ると、何をするサービスであるかが推測できる。
  (5)サービスを起動するための実行ファイル・パスとパラメータ。RpcSsサービスはsvchost.exeから起動されていることを確認できる。

 Windows OSでは、サービスの状態を管理するGUIツールとして、[スタート]メニューに[管理ツール]−[サービス]というツールが用意されている。これを使うと、各サービスの情報を得ることができるが、ここでは「表示名」だけが表示されているので、サービス名しか分からない場合には、サービスの詳細を調査するのは容易ではない。何らかの方法でサービス名から表示名を取得する必要がある。

サービスのGUI管理ツール サービスのGUI管理ツール
GUIベースのサービス管理ツールを使えば、各サービスの説明や動作状態などを調査することができる。ただしサービス名ではなく、表示名によって分類されているので、例えばRpcSsサービスは何か、ということを簡単に知ることはできない。
  (1)これはRpcSsサービスのこと。サービス名から表示名を知ることができれば、どのサービスであるか、そのサービスは何か、といった情報を知ることができる。

 サービス名から表示名を知るにはいくつか方法があるが(上記のレジストリを直接調べるという方法もある)、ここではsc.exeコマンドを使う方法を紹介しておこう。

 sc.exeは、Windows XP/Windows Server 2003で標準で用意されている、サービスを制御するためのコマンドである。数多くのサブコマンドを持っているが、その中にサービスに関する情報を調査するためのサブコマンドがある。sc.exeコマンドのサブコマンド一覧については、別稿の「Windows XPの正体―強化されたコマンドライン・ツール」を参照していただきたい。Windows 2000の場合は、Resource Kitツールに含まれている(Resource Kitツールの入手方法については「TIPS:リソースキット・ツールを入手する」参照)。

 sc.exeにqueryexeサブコマンドを付けて実行すると(「sc queryex」を実行する)、現在システム上で実行されているサービスの一覧情報を得ることができるが、サービスに関するコンフィグレーション情報を得るコマンドとして「qc」サブコマンドも用意されている(それぞれの違いについてはsc.exeのヘルプ・メッセージを参照のこと。queryは動作状態を、qcは設定情報を得るサブコマンド)。これを使うと、次のような情報を得ることができる。

C:\>sc qc rpcss
[SC] GetServiceConfig SUCCESS …コマンドが正常実行された

SERVICE_NAME: rpcss  …サービス名
        TYPE               : 20  WIN32_SHARE_PROCESS
        START_TYPE         : 2   AUTO_START …起動方法
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : C:\WINDOWS\system32\svchost -k rpcss …実行パス
        LOAD_ORDER_GROUP   : COM Infrastructure
        TAG                : 0
        DISPLAY_NAME       : Remote Procedure Call (RPC) …表示名
        DEPENDENCIES       : …依存関係
        SERVICE_START_NAME : LocalSystem



 これを見ると分かるように、サービス名と表示名が表示されている。いったん表示名さえ分かれば、これと同様の情報は、「サービス」管理ツールでも表示させるのは簡単である。表示名を元にサービスを特定し、そのエントリをダブルクリックすればよい。次のようなダイアログが表示される。

管理ツールの「サービス」による表示 管理ツールの「サービス」による表示
RpcSsサービスの情報を表示させたところ。
  (1)サービス名。
  (2)表示名。コマンド・プロンプト上で「net start 〜」コマンドを使う場合は、この表示名が使われることが多い。
  (3)サービスの説明。これによってサービスの概要を知り、トラブルシューティングの助けにすることができる。
  (4)実行ファイルのパス。svchost.exeはさらに内部的に多くのサービスを抱えているので、このようにして、起動するサービスのグループを指定している。
  (5)サービスの起動方法。svchost.exeはシステムの基本的なサービスであり、ユーザーが制御することはできないので淡色表示になっている。
  (6)サービスの動作状態。

■関連記事(Windows Server Insider)

■関連リンク


「Tech TIPS」のインデックス

Tech TIPS

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

@IT Special

- PR -

TechTargetジャパン

Touch Barという新UIを得た「MacBook Pro」、プレゼント!

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。