C# のサービスプログラムをインストールするためのレジストリ設定
ここでは C# で作成したサービスプログラムの簡単なインストール方法を紹介します。
「サービス」というのは、ざっくり言うと Windows のバックグラウンドで実行可能なプログラムのことで、 特に Windows の SCM (サービスコントロールマネージャ) から制御可能なように作られてたプログラムのことをさします。
Windows サービスについて、もう少し詳しく知りたい人は 「Windows サービスとは?」 をみてください。
C# で容易にサービスを開発できるように、 .NET Framework が ServiceBase クラスなどを用意してくれているので、Windows サービスは簡単に開発出来るようになっています。
開発時に "Windows Service" プロジェクトテンプレートを利用して、ある程度決まりきったことをすれば良いようになってます。
Visual Studio によるインストーラクラスの追加
サービスのインストールに関しても Installer クラスなどのサポートがあります。 Visual Studio のサービスデザイナで「インストーラを追加」を選べばインストールの仕組みが組み込まれることになっています。
そして、インストーラが実装されたサービスを作ったら、それを .NET SDK のコマンドである installutil に EXE ファイル名を渡すとインストールされるということになってます。
しかしながら、サービスは基本的に次のレジストリキー以下の情報を構成するだけで動作します。
HKLM \SYSTEM \CurrentControlSet \services
そう思うと、わざわざ installutil コマンドに対応出来るように、インストーラクラスをコードに組み込むというのは、少々やりすぎでかえって面倒な場合も少なくないと思います。
レジストリを書いてインストール終了、という方がずっと簡単です。
それでは具体的に、どのようなレジストリを構成するか説明します。
レジストリは壊してしまうと回復が難しい場合が多いので、設定変更前に念のためバックアップを取って作業を行うことをおすすめします。
Windows のサービス用のレジストリ構成
次のレジストリスクリプトでサービス "Foo" をインストールできます。"Foo" という箇所を適当に書き換えてください。
既存サービスあるいはシステムを壊さないようにくれぐれも慎重に作業してください。
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Foo] "Type"=dword:00000010 "Start"=dword:00000002 "ErrorControl"=dword:00000001 "DisplayName"="Foo Service" "Description"="Foo Service Description" "WOW64"=dword:00000001 "ObjectName"="LocalSystem" "ImagePath"=hex(2):43,00,3a,00,5c,00,74,00,65,00,73,00,74,00,5c,00,66,00,6f,00,\ 6f,00,2e,00,65,00,78,00,65,00,00,00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Foo]
Type の 0x10 は Win32 プログラムであることを示しています。Start の 2 は Automatic スタート (手動なら 3)。 ErrorControl の 1 は Normal。ImagePath は EXE ファイルのフルパス。ObjectName は実行ユーザです。
スタート方法や実行ユーザーは、インストール後にサービスのスナップインから変更できます。
WOW64 は EXE のビルドターゲットが Any CPU または x86 であれば設定します。
DisplayName と Description はサービススナップインなどで見える表示名や説明文になります。
ImagePath は上記は Expandable String Value で C:\test\foo.exe としています。これはレジストリ設定後、 レジストリエディタで書き換えます。
一番下の eventlog 以下への登録は、これを構成しておくと Foo というイベントソースで書き込んだイベントログエントリーが、 イベントビューアでみたときに "Applications and Services Logs" というキーの下に表示されるようになり便利です。
上記構成後、システムを再起動すればサービスは利用可能になるはずです。
上記の例であれば、コマンドからは次で起動可能です。
> net start Foo
以上、C# でサービス作ってもネイティブコードと同様にインストール可能ですよ、というお話でした。