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


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

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

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

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

いったん、セミコロンを削除した後、再度 list.vbs を実行しても、その
エントリは変更されません。リストの中に無いサービスが実行されている
と、追加されますが無い場合は何も起こりません
target.txt
;Browser
;CryptSvc
;DcomLaunch
;Dhcp
;dmserver
;Dnscache
;ERSvc
;Eventlog
;EventSystem
	・
	・
     サービス名の一覧
	・
	・
	・
;srservice
;SSDPSRV
;TapiSrv
;TermService
;Themes
;TrkWks
;W32Time
;winmgmt
;wscsvc
作成するコード
直接実行するスクリプトは、list.vbs ですが、これは必ずコマンド
プロンプトでスクリプトを実行する為にだけ実行されます
Set Fso = CreateObject( "Scripting.FileSystemObject" )
Set WshShell = CreateObject( "WScript.Shell" )

strCurPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurDir = obj.Path

strCommand = "cmd.exe /c cscript """ & strCurDir & "\list_service_started.vbs"" & pause"
Call WshShell.Run( strCommand, , True )
実際の処理は以下のコードになりますが、WMI の扱いは他の PC に対する
ログインを想定してそのように記述しています
str = WScript.FullName
str = Right( str, 11 )
str = Ucase( str )
if str <> "CSCRIPT.EXE" then
	strMessage = "エクスプローラから実行する場合は、list.vbs を使用して下さい"
	WScript.Echo strMessage
	WScript.Quit
end if

Set Fso = Wscript.CreateObject( "Scripting.FileSystemObject" )

strCurPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurDir = obj.Path

strServer = "."

on error resume next
Set objLocator = Wscript.CreateObject("WbemScripting.SWbemLocator")
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if

Set objWmi = objLocator.ConnectServer( _
	strServer, _
	"root\cimv2", _
	strUser, _
	strPass )
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if

objWmi.Security_.ImpersonationLevel = 3
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

addData = ""
if Fso.FileExists( strCurDir & "\target.txt" ) then
	Set InObj = Fso.OpenTextFile( strCurDir & "\target.txt", 1 )
	aData = Split( InObj.ReadAll(), vbCrLf )
	InObj.Close()
else
	aData = Array("")
end if


' WMI よりサービス一覧を取得
Set objTarget = objWmi.ExecQuery( _
 "select Name,Started,PathName from Win32_Service" _
)

on error resume next
For Each obj in objTarget

	if obj.Started then
		bFind = False
		For I = 0 to Ubound(aData)
			strTarget = Trim(aData(I))
			if strTarget = obj.Name then
				bFind = True
				Exit For
			end if
			strTarget = Right(aData(I), Len(aData(I))-1)
			strTarget = Trim(strTarget)
			if strTarget = obj.Name then
				bFind = True
				Exit For
			end if
		Next
		if Not bFind then
			if addData <> "" then
					addData = addData & vbCrLf
			end if
			addData = addData & ";" & obj.Name
		end if
	end if

Next
if addData <> "" then
	addData = addData & vbCrLf
end if
on error goto 0

Set OutObj = Fso.OpenTextFile( strCurDir & "\target.txt", 2, True )

if  Ubound(aData) > 0 then
	OutObj.Write Join( aData, vbCrLf )
end if
OutObj.Write addData

OutObj.Close()
停止用のコード
普通にサービス名が書かれたテキストのリストであれば良いので、
list.vbs によって作成される target.txt である必要はありません。

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

※ その場合は、strServer と、strUser と strPass を直接設定
str = WScript.FullName
str = Right( str, 11 )
str = Ucase( str )
if str <> "CSCRIPT.EXE" then
	strMessage = "エクスプローラから実行する場合は、stop.vbs を使用して下さい"
	WScript.Echo strMessage
	WScript.Quit
end if

Set Fso = Wscript.CreateObject( "Scripting.FileSystemObject" )

strCurPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurDir = obj.Path

strServer = "."

on error resume next
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if

Set objWmi = objLocator.ConnectServer( _
	strServer, _
	"root\cimv2", _
	strUser, _
	strPass )
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if

objWmi.Security_.ImpersonationLevel = 3
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

Set InObj = Fso.OpenTextFile( strCurDir & "\target.txt", 1 )
aTarget = Split( InObj.ReadAll(), vbCrLf )
InObj.Close()

For I = 0 to UBound( aTarget ) 

	if Trim( aTarget( I ) ) <> "" and Left( aTarget( I ), 1 ) <> ";" then

		strQuery = "select * from Win32_Service where Name = '" & aTarget(I) &  "'"
		Set objTarget = objWmi.ExecQuery( strQuery )

		on error resume next
		For Each obj in objTarget

			if obj.Started then
				obj.StopService()
				Wscript.Echo obj.Name & " を停止させました"
			end if

		Next
		on error goto 0

		' 終了待ち
		nCnt = 0
		Do while true
			Wscript.Sleep 1000

			Set objTarget = objWmi.ExecQuery( strQuery )
			For Each obj in objTarget 
				strResult = obj.State
			Next 

			if strResult = "Stopped" then
				Exit Do
			end if

			nCnt = nCnt + 1
			if nCnt > 60 then
				Exit Do
			end if

		Loop

	end if

Next