◆VB 2005でのWindows Service制御 - 使い方

[ 上へ ]

プロジェクトの作成時にModule1.vbファイルに Main関数 が作成されましたが、ここで、先ほど作成したServiceControllerExを使ってみます。

Public Sub Main(ByVal args() As  String)
    Dim svc As New ServiceControllerEx( args(0) )

    'サービス状態の変更---------------------------------------------
    Console.WriteLine( "Status     : "+ svc.Status().ToString())

    If svc.ChangeStatus(ServiceAction.Svc_Stop) Then
        Console.WriteLine( "サービスステータスを変更しました" )
    End If

    Console.WriteLine( "Status     : "+ svc.Status().ToString() + vbCrLf)

    'スタートアップの状態の変更-------------------------------------
    Console.WriteLine( "StartMode  : "+ svc.StartMode().ToString())

    svc.StartMode() = ServiceStartMode.Manual
    Console.WriteLine( "StartMode変更しました" )

    Console.WriteLine( "StartMode  : "+ svc.StartMode().ToString())
End Sub

Main関数に上記を記述してください。
最初の行で第一引数をサービス名としてServiceControllerExのインスタンスを作成して、 以下で実装した各メソッド・プロパティを実行しています。

ツールバーのビルド(B)→ServiceControlのビルド(U)を実行してください。
リリースバージョンの場合はServiceControl\ServiceControl\bin\Releaseに ServiceControl.exeができているので早速実行してみます。

スタート→ファイル名を指定して実行(R)でcmdと入力するとコンソールが起動しますので ServiceControl.exeがあるフォルダに移動してください。移動したら

>ServiceControl.exe "MSSQL$SQLEXPRESS" [リターン]

を実行してください。(この例ではSQL Server 2005 Expressの サービスを停止し、スタートアップの種類を手動に変更しようとしています)

以下のような出力がされると思います。

最後にServiceControllerEx.vbファイルのすべてのコードを掲載しておわります。

'----------------------------------------------------------------------------
'ServiceControllerEx.vb
'----------------------------------------------------------------------------
Imports System.ServiceProcess       'サービス関係
Imports Microsoft.Win32             'レジストリ

'サービスステータス変更アクション
Public Enum ServiceAction
    Svc_Start = 1
    Svc_Stop = 2
    Svc_Pause = 3
    Svc_Continue = 4
End Enum

'サービスステータス
Public Enum ServiceControllerStatus
    Stopped = 1
    StartPending = 2
    StopPending = 3
    Running = 4
    ContinuePending = 5
    PausePending = 6
    Paused = 7
    None = 0            '例外用
End Enum

'スタートアップの種類
Public Enum ServiceStartMode
    Automatic = 2
    Manual = 3
    Disable = 4
    None = 0            '例外用
End Enum

'ServiceController拡張クラス
Public Class ServiceControllerEx
                    Inherits ServiceController

    'コンストラクタ
    Public Sub New(ByVal name As String)
        MyBase.New(name)
    End Sub

    '現在のサービスステータス取得

    Public Shadows ReadOnly Property Status() As ServiceControllerStatus
        Get
            Dim ret As ServiceControllerStatus

            Try
                ret = MyBase.Status()
            Catch ex As Exception
                Return ServiceControllerStatus.None
            End Try
            
            Return ret
        End Get
    End Property

    'サービスステータスの変更
    Public Function ChangeStatus(ByVal action As ServiceAction) As Boolean
        Dim ret As Boolean = True

        Try
            Select Case Status()
                Case ServiceControllerStatus.Paused         '一時停止
                    If action.Equals(ServiceAction.Svc_Continue) Then
                        Me.Continue()
                        WaitForStatus(ServiceControllerStatus.Running)
                    End If

                Case ServiceControllerStatus.Running        '実行中
                    If action.Equals(ServiceAction.Svc_Pause) Then
                        If CanPauseAndContinue() Then
                            Me.Pause()
                            WaitForStatus(ServiceControllerStatus.Paused)
                        End If
                    ElseIf action.Equals(ServiceAction.Svc_Stop) Then
                        If CanStop() Then
                            Me.Stop()
                            WaitForStatus(ServiceControllerStatus.Stopped)
                        >End If
                    End If

                Case ServiceControllerStatus.Stopped        '停止中
                    If action.Equals(ServiceAction.Svc_Start) Then
                        Me.Start()
                        WaitForStatus(ServiceControllerStatus.Running)
                    End If

                Case ServiceControllerStatus.None           '不明
                    ret = False

                Case Else
            End Select

        Catch ex As Exception
            ret = False
        End Try

        Return ret
    End Function

    'スタートアップの種類の取得/変更
    Public Property StartMode() As ServiceStartMode
        Get
            Const SERVICEKEY As String = "SYSTEM\CurrentControlSet\Services\"
            Dim regkey       As RegistryKey
            Dim returnval    As ServiceStartMode
            
            Try
                regkey = Registry.LocalMachine.OpenSubKey(SERVICEKEY + ServiceName())

                Try
                    returnval = CType(regkey.GetValue("Start", ServiceStartMode.None), _
                                                                    ServiceStartMode)
                Catch ex As Exception
                    returnval = ServiceStartMode.None
                Finally
                    regkey.Close()
                End Try

            Catch ex As Exception
                Return ServiceStartMode.None
            End Try

            Return returnval
        End Get

        Set(ByVal value As ServiceStartMode)
            Const SERVICEKEY As String = "SYSTEM\CurrentControlSet\Services\"
            Dim regkey       As RegistryKey

            Try
                regkey = Registry.LocalMachine.OpenSubKey(SERVICEKEY + ServiceName(), True)

                Try
                    regkey.SetValue("Start", value, RegistryValueKind.DWord)
                Catch ex As Exception
                    Return
                Finally
                    regkey.Close()
                End Try

            Catch ex As Exception
                Return
            End Try

        End Set
    End Property

    'マシン名取得
    Public Shadows ReadOnly Property MachineName() As String
        Get
            Return My.Computer.Name()
        End Get
    End Property

End Class

次回はVBA(VB6)での実装をやってみたいと思います。