ブラウザでダウンロード 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 |