VBScript: WMIを使ったサービスの状態取得、開始、停止
WMIを使ってサービスのオブジェクトを取得する。
クエリはサービス名と一致するものを指定。表示にする時は、DisplayName= にする。
Dim Services Set Services = GetObject("winmgmts:").ExecQuery("Select * from Win32_Service Where Name='サービス名'")
上記を踏まえて、サービスの状態取得、開始、停止するFunctionプロシージャ。
' WMI, Win32_Serviceのヘルパを提供 ' サービスの状態を返す ' サービス名で検索し、取得できなければ表示名で検索し、最初に見つかったサービスの状態を返す ' 停止:Stopped ' 開始:Running ' サービスが見つからない:(Empty) Function GetServiceState(strServiceName) Dim Services, Service Set Services = GetObject("winmgmts:").ExecQuery("Select * from Win32_Service Where Name='" & strServiceName & "'") If Services.Count = 0 Then Set Services = GetObject("winmgmts:").ExecQuery("Select * from Win32_Service Where DisplayName='" & StrServiceName & "'") End If For Each Service in Services GetServiceState = Service.State Exit For Next End Function ' 指定されたサービスを開始し、結果を返す ' サービス名で検索し、取得できなければ表示名で検索し、最初に見つかったサービスを開始する Function StartService(strServiceName) Dim Services, Service Set Services = GetObject("winmgmts:").ExecQuery("Select * from Win32_Service Where Name='" & strServiceName & "'") If Services.Count = 0 Then Set Services = GetObject("winmgmts:").ExecQuery("Select * from Win32_Service Where DisplayName='" & StrServiceName & "'") End If StartService = False Dim RetVal For Each Service in Services RetVal = Service.StartService() If RetVal = 0 Then StartService = True ' Started If RetVal = 10 Then StartService = True ' Running Exit For Next End Function ' 指定されたサービスを停止し、結果を返す ' サービス名で検索し、取得できなければ表示名で検索し、見つかった最初のサービスを停止する Function StopService(strServiceName) Dim Services, Service Set Services = GetObject("winmgmts:").ExecQuery("Select * from Win32_Service Where Name='" & strServiceName & "'") If Services.Count = 0 Then Set Services = GetObject("winmgmts:").ExecQuery("Select * from Win32_Service Where DisplayName='" & StrServiceName & "'") End If StopService = False Dim RetVal For Each Service in Services RetVal = Service.StopService() If RetVal = 0 Then StopService = True ' Stopped If RetVal = 5 Then StopService = True ' Already Stopped Exit For Next End Function ' WMI::StartService, StopServiceの戻値は下記参照。 ' http://www.wmifun.net/library/win32_service.html ' 3 - 実行中のほかのサービスが依存しているので停止できません。 '==================== 'Test 'MsgBox GetServiceState("Telephony") ' 表示名 'MsgBox GetServiceState("TapiSrv") ' サービス名 'MsgBox GetServiceState("Alerter") 'StopService("Security Center") 'StopService("Security Center")
WMI Libraryについては下記が詳しいです。
WMI::StartService, StopServiceの戻値はだいたい以下の感じ。
0 - 要求が受け入れられました。
1 - 要求がサポートされない。
2 - ユーザーに必要なアクセスがありません。
3 - そのサービスは、実行中のほかのサービスが依存しているので停止できません。
4 - 要求された制御コードは有効でないか、またはサービスを受け入れ可能ではありません。
5 - サービスの状態 (Win32_BaseService:State) が 0、1、または 2 と等しいので、要求された制御コードはサービスに送信されませんでした。
6 - サービスは開始されていません。
7 - サービスは適切な時間内に開始要求に応答しませんでした。
8 - サービスの開始時に不明なエラーが発生しました。
9 - サービス実行可能ファイルへのディレクトリ パスが見つかりませんでした。
10 - サービスは既に実行しています。
11 - 新しいサービスを追加するデータベースはロックされています。
12 - このサービスが依存する依存関係はシステムから削除されました。
13 - サービスは依存関係のあるサービスから必要なサービスを見つけられませんでした。
14 - サービスはシステムから無効になっています。
15 - サービスにはシステムで実行するための正しい承認がありません。
16 - このサービスはシステムから削除されているところです。
17 - サービスに実行スレッドがありません。
18 - サービスの開始時に循環依存があります。
19 - 同じ名前で実行中のサービスがあります。
20 - サービスの名前に無効な文字があります。
21 - 無効なパラメーターがサービスに渡されました。
22 - このサービスが実行するアカウントは、無効か、またはサービスを実行するアクセス許可がロックされています。
23 - サービスは、システムから利用できるサービスのデータベースにあります。
24 - サービスは現在システムで一時停止されています。
その他 - 上の一覧以外の整数値については Win32 エラー コードのドキュメントを参照してください。