このスクリプトで、再起動前に実行中のサービスと停止したサービスを取得し、マシンの起動後に自動的に開始されなかったサービスを開始しようとしています。サービス名、状態、および開始モードのリストを取得し、カンマ区切りのテキスト ファイルを 1 行ずつ作成するスクリプトは正常に機能します。これは参考用です (interwebs から取得したもので、旅行中にリンクを失いました。わずかに変更されています。):
Const ForAppending = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objLogFile = objFSO.CreateTextFile("service_list.txt", _
ForWriting, True)
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service")
For Each objService in colListOfServices
objLogFile.Write objService.Name & ","
objLogFile.Write objService.StartMode & ","
objLogFile.Write objService.State
objLogFile.Writeline
Next
objLogFile.Close
この次のビットは、ファイルを 1 行ずつ読み取り、すべてのサービスの状態を、マシンがシャットダウンされる前に記録されたサービスの状態と比較します。一致する場合は何もせず、異なる場合はサービスを開始します。
Const ForReading = 1
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objServiceName = objWMIService.get("Win32_Service.Name='" & ServiceName & "'")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("\\some path\service_list.txt",ForReading,True,-2)
Do Until objFile.AtEndOfStream
fLine = Split(objFile.ReadLine,",")
'wscript.echo fLine(2)
if InStr(fLine(2),"Running") then
'wscript.echo "it was running!"
if objServiceName.Started then
'do nothing
else
'Set servicetostart = objWMIService.ExecQuery ("Select " & ServiceName & " from Win32_Service Where Name ='Alerter'")
'servicetostart.StartService()
'Result = objServiceName.StartService
'If 0 <> Result Then
' wscript.echo "Start " & ServiceName & " error:" & Result
'End If
objServiceName.StartService
'wscript.echo Servicename & "could not start with error: " & Result
end if
end if
'wscript.echo objServiceName
Loop
現在、実際にサービスを開始しようとするとエラーが発生します。"Provider Failure code:80041004 Source:SWbemObjectEX" が表示されます。このエラーに関する投稿を調べて、提案された修正を試みました。また、ご覧のとおり、さまざまなバリエーションを試していますが、推測にすぎません。
私の質問に対して、「プロバイダーの失敗」の原因は何ですか? ここで Win32_Service クラスのこれらの情報を調べました。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa394418%28v=vs.85%29.aspx#methods
ここでメソッドを調べました:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa393660%28v=vs.85%29.aspx
しかし、どこが間違っているのかを理解できませんでした。
ありがとう、
ジョー
ちなみに、私がテストしているサービス、つまり. サービスが開始されていることを確認し、テキスト ファイルを作成してから、サービスを停止し、「サービスの開始」コードを実行するのが Windows Defender です。サービス名は「WinDefend」です。
最終作業コード:
Const ForReading = 1
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("\\vmware-host\Shared Folders\Documents\Biffduncan\Monthly Server Maintanence\service_list.txt",ForReading,True,-2)
Do Until objFile.AtEndOfStream
fLine = Split(objFile.ReadLine,",")
Set objService = objWMIService.get("Win32_Service.Name='" & fLine(0) & "'")
if InStr(fLine(2),"Running") then
'wscript.echo "it was running!"
if objService.Started then
'do nothing
else
Result = objService.StartService()
if Result <> 0 then
wscript.echo "The service: " & objService.Name & " did not start with error: " & Result
else
wscript.echo "Service " & objService.Name & " started"
end if
end if
end if
Loop