PR
 前回,Windowsのサービス管理のための強力なコマンドラインツール「SC(sc.exe)」について簡単に紹介した。今回は新しいサービスを作成するSCのサブコマンドの一つを実際に使用し,その過程でサービスの動作について詳細に説明していく。

まずは試してみよう

 Webカメラから2,3分ごとに画像を取得し,一定のアドレスに電子メールで送信する新しいサービスをインストールすることを考えてみよう。このサービスは無償で提供されているが,ドキュメントは整備されていない。わかっていることはサービスの名前がwcmail.exeであり,C:\wc\wcmail.exeにダウンロードしたということだけである。

 SCを利用した,最も簡単なセットアップコマンドは次のようになる(等号とパラメータの間に空白が必要であることに注意していただきたい)。

sc create Webimagemailer binpath= C:\wc\wcmail.exe 

実行後,SCは簡単なメッセージ

[SC] CreateService SUCCESS

を出す。

 このコマンドは複数のタスクを実行する。最初に,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ServicesにサブキーWebimagemailerを作成する。次に,このサブキーにさらにEnumおよびSecurityの二つのサブキーを作成する(この二つは大抵のサービスに存在する)。SCはさらに,これらのサブキーにいくつかの構成オプションを設定する(これは後で微調整できる)。先ほどの例では,これらのオプションの一つImagePathに,「binpath= 」パラメータで指定したサービスの位置を設定している。

 Microsoft Management Console(MMC)Servicesスナップインを確認してみると,Webimagemailerというサービスが表示されていることがわかる。これはLocalSystemアカウント下で動作する,手動で開始されるサービスである。

 スタートアップの設定を構成するために,「start= 」のパラメータで,boot,system,auto,demand(SCでは手動開始を意味する)またはdisabledを指定できる。同様に「obj= ユーザー名」のパラメータで,SCが動作するアカウントを制御できる。

 セキュリティを重視し,不明なサービスをローカルシステム・アカウントで実行したくない場合は,例えばwebcamguyなどのアカウントをパスワードswordfishで作成し,wcmail.exeがジョブを実行できるだけの権限を付与することができる。この作業を行う際,Webimagemailerという名前はServicesスナップインでは若干見にくいので,「displayname= 記述名」オプションを使用するとサービス一覧の中で見栄えが良くなる。

より良いサービスを作成する

 ここまでできたら,これを改良してより良いコマンドを作成したいと思うだろう。最初に作成したサービスを削除して,新しいサービスのためのリソースを確保するには,次のコマンドを実行する。

sc delete Webimagemailer 

 これによって,サービスが削除対象となる。システムを再起動すると実際に削除され,次のコマンドで新しい開始タイプ,サービス・アカウント,および表示名を追加できるようになる。

sc create webimagemailer binpath= C:\wc\wcmail.exe 
  start= auto displayname= "Web cam image mailer" 
  obj= .\webcamguy password= swordfish 

 繰り返しになるが,等号の後には空白が必要である。空白を忘れるとSCは正常に動作しない。

エラー・メッセージに対して微調整を行う

 Webカメラ・サービスは素晴らしいが,面倒な側面もある。Webカメラを何らかの理由でコンピュータから外して再接続を忘れると,最低一つのサービスまたはドライバでエラーが発生したことを示すメッセージが,コンピュータを起動するたびに表示されるのだ。Webカメラ・サービスは利用できないことを示すメッセージが絶え間なく必要なほど重要なものではない。したがってこのメッセージは,表示しないほうが良いだろう。

 「error= 」パラメータを使用すると,このメッセージを表示させないようにできる。Windowsはサービスの起動状況を監視しており,ユーザーは開始エラーに対するOSの反応を次の4種類のいずれかに設定できる。

 normalはデフォルトのオプションであり,メッセージを表示してWindowsを通常どおり起動する。ignoreはユーザーにとって便利なオプションであり,イベントログに開始エラーを記録するだけである。severeはサービスまたはドライバの重要性を認識し,OSを最後の正常起動時の構成で再起動する。criticalは最後の正常起動時の構成でWindowsを再起動するが,ドライバまたはサービスがロードできない場合はブルースクリーンを表示する。

 したがって,サービスを削除して再起動し,「error= ignore」パラメータを指定することで,いったんはうまくいくように見える。ただし,すぐに“依存性の問題”を解決しなければならないことに気づくだろう。これについては次回,取り上げたいと思う。