C# 入門

ホーム > C# の各種トピック > サービスプログラムをインストールするためのレジストリ設定

サービスプログラムをインストールするためのレジストリ設定

ここでは C# で作成したサービスプログラムの簡単なインストール方法を紹介します。

「サービス」というのは、ざっくり言うと Windows のバックグラウンドで実行可能なプログラムのことで、 特に Windows の SCM (サービスコントロールマネージャ) から制御可能なように作られてたプログラムのことをさします。

Windows サービスについて、もう少し詳しく知りたい人は 「Windows サービスとは?」 をみてください。

C# でも .NET Framework が ServiceBase クラスなどを用意してくれているので、Windows サービスは簡単に開発出来るようになっています。

開発時に "Windows Service" プロジェクトテンプレートを利用して、ある程度決まりきったことをすれば良いようになってます。

サービスのインストールも Installer クラスなどのサポートはあって、Visual Studio のサービスデザイナで「インストーラを追加」などを選べば インストールの仕組みが組み込まれることになっています。

そして、インストーラが実装されたサービスを作ったら、それを .NET SDK のコマンドである installutil に EXE ファイル名を渡すとインストールされるということになってます。

しかしながら、サービスは基本的に次のレジストリキー以下の情報で構成可能です。

HKLM
 \SYSTEM
  \CurrentControlSet
   \services

そう思うと、わざわざ installutil コマンドに対応出来るように、インストーラクラスをコードに組み込むというのは、少々やりすぎでかえって面倒な場合も少なくないと思います。

レジストリを書いてインストール終了、という方がずっと簡単です。

それでは具体的に、どのようなレジストリを構成するか説明します。

ちなみに、レジストリは壊してしまうと回復が難しい場合が多いので、設定変更前に念のためバックアップを取って作業を行うことをおすすめします。

サービス用のレジストリ構成

次のレジストリスクリプトでサービス "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# でサービス作ってもネイティブコードと同様にインストール可能ですよ、というお話でした。

ホーム > C# の各種トピック > サービスプログラムをインストールするためのレジストリ設定