Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Windowsのサービス状態を表示するアプリケーションの作成

System.ServiceProcess名前空間を利用したサービスの操作

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2005/09/01 17:15

本稿では、System.ServiceProcess名前空間を使用して、ローカルコンピュータのサービス状態をチェックするアプリケーションを作成します。

完成図
完成図

概要

 .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クラス
  • このクラスでは、Windowsサービスへの接続や操作、情報の取得ができます。

アプリケーションの作成

 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(制御部分追加)」をダウンロードしてお試しいただければと思います。

参考資料

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • Elfaria(エルファリア)

    VBerなニッチ系へたれプログラマ。 得意分野はツール・ユーティリティ系アプリ。 苦手分野はデータベース関連アプリ。 Tips of VB.NET 管理人 http://tipsofvb.net

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5