プロジェクトの作成時に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)での実装をやってみたいと思います。