リッスンしているネットワーク・ポートを調べていると、svchost.exeというプロセスが所有者となっていることがよくある。svchost.exeは、ネットワーク関連の基本的なサービスを起動するための親となるプロセスであり、いくつかのグループに分けてサービスを起動している。scコマンドを使うと、サービスをコマンド・プロンプトから制御することができる。
対象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.exeは、OS内の各種サービスを起動するための親となるプロセスである。OS起動時には、svchost.exeを経由して、各種のネットワーク・サービスが起動するようになっている。svchost.exeが起動するサービスは、レジストリの以下のキーに記述されている。
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost
実際のレジストリ設定を見ると、次のようにグループごとにサービスが分類されていることが分かる。これは、あるWindows XP Professionalマシンにおける例である。
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」の下にサービス名のキーが作られ、そこに記録されている。
Windows OSでは、サービスの状態を管理するGUIツールとして、[スタート]メニューに[管理ツール]−[サービス]というツールが用意されている。これを使うと、各サービスの情報を得ることができるが、ここでは「表示名」だけが表示されているので、サービス名しか分からない場合には、サービスの詳細を調査するのは容易ではない。何らかの方法でサービス名から表示名を取得する必要がある。
サービス名から表示名を知るにはいくつか方法があるが(上記のレジストリを直接調べるという方法もある)、ここでは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
これを見ると分かるように、サービス名と表示名が表示されている。いったん表示名さえ分かれば、これと同様の情報は、「サービス」管理ツールでも表示させるのは簡単である。表示名を元にサービスを特定し、そのエントリをダブルクリックすればよい。次のようなダイアログが表示される。
■関連記事(Windows Server Insider)
■関連リンク
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.