Windows XP Service Pack 2(SP2)関連情報に目を通してみると,めったに使われないサービスはデフォルトで無効にする方針が打ち出されています。また,マイクロソフト日本法人は,こちらのWebページを公開し,Internet Information Services (IIS)などの利用していないサービスが動作しているコンピュータはセキュリティ上好ましくないと述べ,使用する予定がないサービスはシステムからアンインストールすることを推奨しています。

 ところが,私たちWindowsユーザーの視点から見ると,不要なサービスをアンインストールしたり,使用頻度の低いサービスを無効化する操作は難度の高い部類に入ります。そこで今回は,Windowsプログラムの代表ともいえるメモ帳とサービスを比較しながら,サービスとはそもそも何なのかを考えてみることにします。

サービスとは何か

 まず,「サービスとは何か」を考えてみましょう。この疑問への回答を用意することはたいへん難しい作業です。このような場合,目の前の難問に直接ぶつかるのではなく,身近にある単純かつ具体的な例を振り返ってみることが大切です。サービスは,正確には,Windowsサービス・プログラムと呼ばれ,メモ帳などの通常のWindowsプログラムの仲間に入ります。しかし結論を先に言うと,サービスとメモ帳の間には次のような大きな違いがあります。

起動方法が異なる

 サービスとメモ帳の間には,これ以外の相違点も多数ありますが,今回はこの1点のみに焦点を当てます。それではまず,今回用意したサンプル・プログラムの使い方から説明しましょう。

サンプル・プログラムの使い方

 サンプル・プログラムはVBScript言語で記述され,こちらからダウンロードできるようになっています。ダウンロードしたサンプル・プログラムをメモ帳などのテキスト・エディタで開くと,次のようなコードが含まれています。

'If CBool(ucase(oObject_2.StartMode) = ucase("Boot")) Then
'If CBool(ucase(oObject_2.StartMode) = ucase("System")) Then
'If CBool(ucase(oObject_2.StartMode) = ucase("Auto")) Then
'If CBool(ucase(oObject_2.StartMode) = ucase("Manual")) Then
'If CBool(ucase(oObject_2.StartMode) = ucase("Disabled")) Then

 このソースコード内に含まれている「Boot」や「System」などのコードは,後半で詳しく説明するサービスの起動方法を示しています。現時点では,「サービスの起動方法は5種類ある」程度の理解で差し支えありません。

 まったくプログラミング経験のない方は,各行の先頭にあるシングル引用符「'」を削除し,保存してからプログラム・ファイルをダブルクリックして,実行してみてください。ただし,一度に削除できるシングル引用符は,1つだけです。複数行のシングル引用符を同時に削除することはできません。この点は注意してください。

 プログラミング経験のある方は,目的のソースコード行のコメントアウトを取り外し,返される情報を多少時間をかけて検討するとよいでしょう。そして,時間があれば,次のような複数の条件を同時に設定し,さらに詳細な情報を取得してみるとよいと思います。

'If CBool(oObject_2.AcceptStop = False) And CBool(ucase(oObject_2.State) = ucase("Stopped")) And CBool(oObject_2.Started = True) Then

 この複数条件設定コードから分かるように,ちょっと難しい表現になりますが,「クラス・インスタンスのプロパティを条件式内で使用しているだけ」です。今回のサンプル・プログラムを繰り返し実行すれば,「サービスとは何か」への自分なりの回答を見つけられるはずです。回答を見つけ出す過程で習得した知識は,SP2をインストールした後のシステム環境を調査する際に,そのまま活用できるはずです。ぜひ挑戦してみてください。

 なお,サンプル・プログラム内には,参考となる条件を設定したコード例を載せておきました。条件コードはデフォルトではすべてコメントアウト(実行無効)してありますから,実行する際にはソースコード先頭のシングル引用符「'」を削除してください。それでは,サンプル・プログラムを実際に活用しながら,起動方法とサービスの関係を具体的に調べてみましょう。

サービスの起動方法を調べる

 一般にメモ帳を起動する場合,「スタート>すべてのプログラム>アクセサリ」などのGUI操作を行います。一方,サービスを起動する場合にはGUI操作は基本的に必要ありません。それではサービスはどのように起動するのでしょうか。サービスには,次のような5通りの起動方法が用意されています。

起動方法1:コンピュータ・システムとの同時起動
起動方法2:Windowsシステムとの同時起動
起動方法3:サービス・コントロール・マネジャ(SCM)による起動
起動方法4:任意の時点での手動起動
起動方法5:起動の全面無効

 ご覧のように,サービスの起動方法には5種類あります。ここでは,SCMなどの難しい用語は無視し,次の点だけを覚えておきましょう。

  • 起動方法1と2で起動するサービスは,特殊なサービスである
  • 起動方法1と2で起動するサービスは,システム・ドライバ・サービスやカーネル・ドライバ・サービスと呼ばれている
  • 起動方法3で起動するサービスは,通常のWindowsサービスである

 特殊なサービス,システム・ドライバ・サービス,カーネル・ドライバ・サービスなどのたいへん難しい用語が登場しました。ここでは難解な用語を定義するのではなく,いくつかの具体的なサービスの情報を画面に表示させてみます。まずは,起動方法1によって起動されるサービス(便宜上「ブート起動型サービス」と呼ぶことにします)にはいったいどのようなサービスがあるのかを調べます。この調査では,サンプル・プログラム内の次のソースコードを有効に(シングル引用符を削除)します。

'If CBool(ucase(oObject_2.StartMode) = ucase("Boot")) Then

図1●筆者の環境での「ブート起動型サービス」情報
 筆者のWindows XP SP1環境では図1[拡大表示]のようなブート起動型サービスの存在が報告されました。

 この結果を見ると,ブート起動型サービスは意外と少ないことが分かります。ブート起動型サービスの名称やファイル名などの詳しい情報は,画面をスクロール・ダウンすると表示されます。時間のあるときにぜひ自分の目で確認してください。ブート起動型サービスは,厳密にはWindowsサービスの仲間ではあっても,Windowsプログラムの仲間に入りません。

 試しに,画面をスクロール・ダウンし,ProcessIDというプロパティがあるかどうか確認してみてください。ブート起動型サービスは,私たちのハードウエア資源を管理するという重要な役割を持っているため,IISのようにシステムから簡単に削除することはできません。

 それでは今度は,起動方法3によって起動されるサービス(便宜上「通常のサービス」と呼ぶことにします)の情報を取得してみましょう。この操作では,次のソースコードを有効にします。

'If CBool(ucase(oObject_2.StartMode) = ucase("Auto")) Then

図2●筆者の環境での「通常のサービス」情報
 筆者の環境では図2[拡大表示]のような情報が返されました。

 この画面情報から分かるように,すべてのサービスが自動的に起動されるわけではありません。残りの起動方法2,4,および5に対応するサービス情報を表示したいときには,それぞれ次のソースコード行を有効にするだけです。

'If CBool(ucase(oObject_2.StartMode) = ucase("System")) Then
'If CBool(ucase(oObject_2.StartMode) = ucase("Manual")) Then
'If CBool(ucase(oObject_2.StartMode) = ucase("Disabled")) Then

 皆さんの中には,「あのサービスはどうなっているのだろう」と特定のサービスの状態を確認したい人もいるでしょう。それではここで,アンインストールできるといわれるIISサービスの状態を表示させてみましょう。この操作では,次のソースコードを有効にします。

'If CBool(ucase(oObject_2.Name) = ucase("W3SVC")) Then

図3●筆者の環境でのIISサービスの状態
 筆者の環境では図3[拡大表示]のようになっています。

 さて,皆さんの環境ではどのような情報が返されるでしょう。IISサービスを使用する予定がない場合,冒頭に紹介したマイクロソフトのWebページを訪問し,アンインストールするとよいでしょう。以上で「サービスとは何か」という説明は終了しますが,これまでの説明で物足りない方は,いろいろな条件を追加し,今回のサンプル・プログラムを実行させてみるとよいでしょう。それでは最後に,今回のサンプル・プログラムの特徴を説明することにします。

サンプル・プログラムの特徴

 今回用意したサンプル・プログラム内では,次のような3種類のクラスを使用し,プログラムの開発効率を改善しています。

Win32_BaseService
Win32_Service
Win32_SystemDriver

 サンプル・プログラムはデフォルトでWin32_BaseServiceクラスだけを使用していますが,残りの2つのクラスを使用することも可能です。これら3種類のクラス間の関係は,次のように整理できます。

Win32_BaseServiceクラスは,Win32_ServiceクラスとWin32_SystemDriverクラスの基本クラスである

 オブジェクト指向プログラミングに慣れていない方にはちょっと分かりにくいかもしれませんが,ここでは,Win32_BaseServiceクラスというのは,Win32_ServiceクラスとWin32_SystemDriverクラスの意味を同時に含んでいる,と考えておいてください。日常的な例で言えば,生徒という概念が男の生徒と女の生徒の意味を含んでいるのと同じです。

 このため,男の生徒数と女の生徒数の合計が生徒数になるように,Win32_ServiceクラスとWin32_SystemDriverクラスのインスタンス数の合計は,次のように,Win32_BaseServiceクラスのインスタンス数になります。

Class Name: Win32_BaseService
Total Instance Count: 273

Class Name: Win32_Service
Total Instance Count: 82

Class Name: Win32_SystemDriver
Total Instance Count: 191

 ご覧のように,Win32_Serviceの数値82とWin32_SystemDriverの数値191を加算すれば,その和は273になります。数値273は,Win32_BaseServiceの数値と同じになります。これらの数値は,SP2インストール後どのように変更されるのか本当に楽しみなところです。使用するクラスを切り替えると,その都度異なる情報が返されます。オブジェクト指向プログラミングなどに興味のある方は,ぜひ挑戦してください。

 以上でWindowsサービスの説明は終了しますが,皆さんの中には,ちょっと物足りないと感じられた方もいることでしょう。そのような方は,ソースコードを検討し,自分なりの条件を細かく設定してみてください。ポイントは,意味のあるプロパティを見つけ出し,それを条件式内に記述することです。プログラミング初心者でも少し学習すれば,条件式を自由に記述できるようになります。恐れることなく,積極的に挑戦しましょう!

今回のまとめ

  • サービスにはWindowsサービスとシステム・ドライバ・サービスがある
  • サービスは2種類のクラスとして分かりやすく整理されている
  • サービスのプロパティを調べれば,サービスの状態が分かる
  • サービスのプロパティは条件式内で自由に活用できる

 今回は以上で終了です。次回またお会いいたしましょう。ごきげんよう!