リストしたサービス(含リモート)を一括して停止 :【VBS】


ブラウザでダウンロード
Windows には通常はあまり必要がない( 実際はめったに使わない )サービスがたくさんありますが、
作業のサイクルによっても、その不必要率は変化します。

逆に言うと、サービスの設定で「停止」に設定してしまうと、今度必要な場合に
使え無い原因が解らなかったり、すぐ使えなかったりいろいろ問題があります。

ですから、インストール時に実行されているサービス等は通常実行しておいて、
作業に入る前にいらないサービスを停止したほうが良いです。
また、そうする事によってサービスに対する理解も深まるはずです
対象リストの作成
list.vbs をエクスプローラからダブルクリックすると、target.txt が
作成され、対象リストが作成されます。

現在実行中のサービスの一覧を取得して、最初はコメントデータとして
先頭にセミコロンを置き、停止したいサービスのセミコロンを削除します

いったん、セミコロンを削除した後、再度 list.vbs を実行しても、その
エントリは変更されません。リストの中に無いサービスが実行されている
と、追加されますが無い場合は何も起こりません
target.txt
01.;Browser
02.;CryptSvc
03.;DcomLaunch
04.;Dhcp
05.;dmserver
06.;Dnscache
07.;ERSvc
08.;Eventlog
09.;EventSystem
10.    
11.    
12.     サービス名の一覧
13.    
14.    
15.    
16.;srservice
17.;SSDPSRV
18.;TapiSrv
19.;TermService
20.;Themes
21.;TrkWks
22.;W32Time
23.;winmgmt
24.;wscsvc
作成するコード
直接実行するスクリプトは、list.vbs ですが、これは必ずコマンド
プロンプトでスクリプトを実行する為にだけ実行されます
01.Set Fso = CreateObject( "Scripting.FileSystemObject" )
02.Set WshShell = CreateObject( "WScript.Shell" )
03. 
04.strCurPath = WScript.ScriptFullName
05.Set obj = Fso.GetFile( strCurPath )
06.Set obj = obj.ParentFolder
07.strCurDir = obj.Path
08. 
09.strCommand = "cmd.exe /c cscript """ & strCurDir & "\list_service_started.vbs"" & pause"
10.Call WshShell.Run( strCommand, , True )
実際の処理は以下のコードになりますが、WMI の扱いは他の PC に対する
ログインを想定してそのように記述しています
01.str = WScript.FullName
02.str = Right( str, 11 )
03.str = Ucase( str )
04.if str <> "CSCRIPT.EXE" then
05.    strMessage = "エクスプローラから実行する場合は、list.vbs を使用して下さい"
06.    WScript.Echo strMessage
07.    WScript.Quit
08.end if
09. 
10.Set Fso = Wscript.CreateObject( "Scripting.FileSystemObject" )
11. 
12.strCurPath = WScript.ScriptFullName
13.Set obj = Fso.GetFile( strCurPath )
14.Set obj = obj.ParentFolder
15.strCurDir = obj.Path
16. 
17.strServer = "."
18. 
19.on error resume next
20.Set objLocator = Wscript.CreateObject("WbemScripting.SWbemLocator")
21.if Err.Number <> 0 then
22.    Wscript.Echo Err.Description
23.    Wscript.Quit
24.end if
25. 
26.Set objWmi = objLocator.ConnectServer( _
27.    strServer, _
28.    "root\cimv2", _
29.    strUser, _
30.    strPass )
31.if Err.Number <> 0 then
32.    Wscript.Echo Err.Description
33.    Wscript.Quit
34.end if
35. 
36.objWmi.Security_.ImpersonationLevel = 3
37.if Err.Number <> 0 then
38.    Wscript.Echo Err.Description
39.    Wscript.Quit
40.end if
41.on error goto 0
42. 
43.addData = ""
44.if Fso.FileExists( strCurDir & "\target.txt" ) then
45.    Set InObj = Fso.OpenTextFile( strCurDir & "\target.txt", 1 )
46.    aData = Split( InObj.ReadAll(), vbCrLf )
47.    InObj.Close()
48.else
49.    aData = Array("")
50.end if
51. 
52. 
53.' WMI よりサービス一覧を取得
54.Set objTarget = objWmi.ExecQuery( _
55. "select Name,Started,PathName from Win32_Service" _
56.)
57. 
58.on error resume next
59.For Each obj in objTarget
60. 
61.    if obj.Started then
62.        bFind = False
63.        For I = 0 to Ubound(aData)
64.            strTarget = Trim(aData(I))
65.            if strTarget = obj.Name then
66.                bFind = True
67.                Exit For
68.            end if
69.            strTarget = Right(aData(I), Len(aData(I))-1)
70.            strTarget = Trim(strTarget)
71.            if strTarget = obj.Name then
72.                bFind = True
73.                Exit For
74.            end if
75.        Next
76.        if Not bFind then
77.            if addData <> "" then
78.                    addData = addData & vbCrLf
79.            end if
80.            addData = addData & ";" & obj.Name
81.        end if
82.    end if
83. 
84.Next
85.if addData <> "" then
86.    addData = addData & vbCrLf
87.end if
88.on error goto 0
89. 
90.Set OutObj = Fso.OpenTextFile( strCurDir & "\target.txt", 2, True )
91. 
92.if  Ubound(aData) > 0 then
93.    OutObj.Write Join( aData, vbCrLf )
94.end if
95.OutObj.Write addData
96. 
97.OutObj.Close()
停止用のコード
普通にサービス名が書かれたテキストのリストであれば良いので、
list.vbs によって作成される target.txt である必要はありません。

また、少し変更( PC/USER/PASS を設定 )すれば、指定した PC の
サービスを一括して停止する事も可能です

※ その場合は、strServer と、strUser と strPass を直接設定
01.str = WScript.FullName
02.str = Right( str, 11 )
03.str = Ucase( str )
04.if str <> "CSCRIPT.EXE" then
05.    strMessage = "エクスプローラから実行する場合は、stop.vbs を使用して下さい"
06.    WScript.Echo strMessage
07.    WScript.Quit
08.end if
09. 
10.Set Fso = Wscript.CreateObject( "Scripting.FileSystemObject" )
11. 
12.strCurPath = WScript.ScriptFullName
13.Set obj = Fso.GetFile( strCurPath )
14.Set obj = obj.ParentFolder
15.strCurDir = obj.Path
16. 
17.strServer = "."
18. 
19.on error resume next
20.Set objLocator = CreateObject("WbemScripting.SWbemLocator")
21.if Err.Number <> 0 then
22.    Wscript.Echo Err.Description
23.    Wscript.Quit
24.end if
25. 
26.Set objWmi = objLocator.ConnectServer( _
27.    strServer, _
28.    "root\cimv2", _
29.    strUser, _
30.    strPass )
31.if Err.Number <> 0 then
32.    Wscript.Echo Err.Description
33.    Wscript.Quit
34.end if
35. 
36.objWmi.Security_.ImpersonationLevel = 3
37.if Err.Number <> 0 then
38.    Wscript.Echo Err.Description
39.    Wscript.Quit
40.end if
41.on error goto 0
42. 
43.Set InObj = Fso.OpenTextFile( strCurDir & "\target.txt", 1 )
44.aTarget = Split( InObj.ReadAll(), vbCrLf )
45.InObj.Close()
46. 
47.For I = 0 to UBound( aTarget )
48. 
49.    if Trim( aTarget( I ) ) <> "" and Left( aTarget( I ), 1 ) <> ";" then
50. 
51.        strQuery = "select * from Win32_Service where Name = '" & aTarget(I) &  "'"
52.        Set objTarget = objWmi.ExecQuery( strQuery )
53. 
54.        on error resume next
55.        For Each obj in objTarget
56. 
57.            if obj.Started then
58.                obj.StopService()
59.                Wscript.Echo obj.Name & " を停止させました"
60.            end if
61. 
62.        Next
63.        on error goto 0
64. 
65.        ' 終了待ち
66.        nCnt = 0
67.        Do while true
68.            Wscript.Sleep 1000
69. 
70.            Set objTarget = objWmi.ExecQuery( strQuery )
71.            For Each obj in objTarget
72.                strResult = obj.State
73.            Next
74. 
75.            if strResult = "Stopped" then
76.                Exit Do
77.            end if
78. 
79.            nCnt = nCnt + 1
80.            if nCnt > 60 then
81.                Exit Do
82.            end if
83. 
84.        Loop
85. 
86.    end if
87. 
88.Next