概要
.NET Frameworkクラスライブラリ内に含まれるSystem.ServiceProcess
名前空間を利用すると、簡単にWindowsのサービスを取得・設定したり、サービスアプリケーションを実装したりすることが可能になります。
ここでは、Windowsのサービスの状態を表示する簡単なアプリケーションを作成してみたいと思います。
対象読者
.NETでサービスの監視・制御を検討している方。
必要な環境
扱う内容がWindowsのサービスですので、対象OSはWindows 2000/XP/Server 2003となります。
また、ソースファイルをビルドするには、Visual Studio .NET 2003またはVisual Basic .NET 2003が必要です。
主に扱うクラス
System.ServiceProcess
名前空間のServiceController
クラス
アプリケーションの作成
Visual Studio .NET 2003(あるいは、Visual Basic .NET 2003)でプロジェクトを作成します。今回は、通常のWindowsフォーム アプリケーションを作成するので、[Windowsアプリケーション]を選択します。
プロジェクトを作成したら、[参照設定]を右クリックして[参照の追加]を選択し、[.NET]タブの[System.ServiceProcess.DLL]を参照設定に加えてください。
次に、フォームのサイズを変更し、コンボボックスとラベルを配置してName
値を変更します(下図参照)。
- コンボボックスは
cboSelSvc
- ラベルは
lblStats
とでもしておきましょう。
あとは、タイマーを貼り付けます。タイマーのName
値は、デフォルトのままでもいいかと思います。Interval
プロパティ(Tick
イベントが発生する間隔)は「5000」(5秒)としておきましょう。割り込みの時間は好きなように変えていただいてかまいませんが、「3000」(3秒)~「10000」(10秒)位を目安にしたほうがよいでしょう。
以上の3種類があれば、少なくとも作成できます。
コードの記述
次に、フォームのロードするときのイベントに、現在のサービスの一覧をコンボボックスにセットするコードを記述します。
Private Sub Form1_Load(ByVal sender As Object, ByVal e _ As System.EventArgs) Handles MyBase.Load 'サービスの一覧の取得 Dim Svcs() As ServiceProcess.ServiceController Svcs = ServiceProcess.ServiceController.GetServices For Each Svc As ServiceProcess.ServiceController In Svcs cboSelSVC.Items.Add(Svc.DisplayName) Next '一番最初のサービス名をコンボボックスのテキスト値にセット cboSelSVC.Text = cboSelSVC.Items.Item(0) 'ポーリングタイマーをスタート Timer1.Start() End Sub
また、サービスの状態を取得して、ラベルに表示するメソッドを作成します。
'サービス状態を取得して表示する Private Sub GetStatus() Dim ServiceStat As New ServiceProcess.ServiceController ServiceStat.DisplayName = cboSelSVC.Text Try Select Case ServiceStat.Status Case ServiceProcess.ServiceControllerStatus.ContinuePending lblStats.Text = "再開中" Case ServiceProcess.ServiceControllerStatus.Paused lblStats.Text = "一時停止中" Case ServiceProcess.ServiceControllerStatus.PausePending lblStats.Text = "一時停止状態に移行中" Case ServiceProcess.ServiceControllerStatus.Running lblStats.Text = "動作中" Case ServiceProcess.ServiceControllerStatus.StartPending lblStats.Text = "開始中" Case ServiceProcess.ServiceControllerStatus.Stopped lblStats.Text = "停止中" Case ServiceProcess.ServiceControllerStatus.StopPending lblStats.Text = "停止状態に移行中" End Select Catch ex As InvalidOperationException lblStats.Text = "サービス名エラー" End Try End Sub
さらに、この作成した関数が、タイマーの割り込みが発生した時に動作するように記述します(Timer1_Tick
イベントを作成します)。
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e _ As System.EventArgs) Handles Timer1.Tick GetStatus() End Sub
コンボボックスを変更した際にもイベントを発生させてもいいかと思います(各自の好みでかまいません)。
Private Sub cboSelSVC_SelectedValueChanged(ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles cboSelSVC.SelectedValueChanged GetStatus() End Sub
最後に、起動したときにも一度状態を取得するように、GetStatus
メソッドをTimer1.Start
の直前に入れておきましょう。
これで完成です。
実行すると、コンボボックスで選択しているサービスの動作状態が、ラベルに表示されるかと思います。
まとめ
System.ServiceProcess
名前空間では、他にもいろいろなことが可能です。今回はローカルコンピュータのサービスを取得しましたが、引数にマシン名を指定することで、他のコンピュータのサービス状態を取得することもできます。これを発展させて、独自の監視アプリケーションを作ってみてもよいかと思います。
また、サービス情報の取得だけではなく、制御もできるようにしたサンプルソースも用意しました。最上部の「ソースコードその2(制御部分追加)」をダウンロードしてお試しいただければと思います。
参考資料
- MSDNライブラリ 『System.ServiceProcess 名前空間』
- MSDNライブラリ 『ServiceControllerクラス』