推定無題

日々調べたこととか

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 エラー コードのドキュメントを参照してください。