3

このスクリプトで、再起動前に実行中のサービスと停止したサービスを取得し、マシンの起動後に自動的に開始されなかったサービスを開始しようとしています。サービス名、状態、および開始モードのリストを取得し、カンマ区切りのテキスト ファイルを 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
4

1 に答える 1