使用VBscript启动服务



我正试图让这个脚本在重新启动之前获取一个正在运行并停止服务的文本文件,并启动任何在机器启动备份后没有自动启动的服务。获取服务名称、状态和启动模式列表并逐行创建逗号分隔的文本文件的脚本运行良好。这里是参考(取自互联网,在我的旅行中丢失了链接。略有修改。):

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 & "rootcimv2")
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

下一位逐行读取文件,将所有服务的状态与机器关闭前记录的服务的状态进行比较。如果它们匹配,什么也不做,如果它们不同,启动服务:

Const ForReading = 1
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\" & strComputer & "rootcimv2")
Set objServiceName = objWMIService.get("Win32_Service.Name='" & ServiceName & "'")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("\some pathservice_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

到目前为止,每当它真正尝试启动服务时,我都会收到一个错误。我收到一个"提供程序故障代码:80041004来源:SWbemObjectEX"。我一直在浏览关于这个错误的帖子,并尝试建议的修复方法。此外,正如你所看到的,我一直在尝试变化,但恐怕我只是猜测。

那么,我的问题是,是什么导致了"提供商失败"?我在此处查找了Win32_Service Class的以下信息:

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

但一直无法找出我哪里出了问题。

谢谢,

Joe

顺便说一句,我正在测试的服务,即确保服务正在启动,创建文本文件,然后停止服务并运行"启动服务"代码,是Windows Defender。服务名称为"WinDefend"。

最终工作代码:

Const ForReading = 1
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\" & strComputer & "rootcimv2")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("\vmware-hostShared FoldersDocumentsBiffduncanMonthly Server Maintanenceservice_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

错误代码0x80041004表示WMI提供程序在初始化后遇到错误。不过,错误代码没有说明错误的原因,也没有提供任何细节。请尝试运行WBEMTestWMIDiag来查找错误。还要查看事件日志中的相关错误/警告。如果其他所有操作都失败,请尝试重建WMI存储库。

至于你的代码,我要做的第一件事就是把它精简到最低限度,以避免潜在的错误来源:

Set wmi = GetObject("winmgmts://./root/cimv2")
Set svc = wmi.Get("Win32_Service.Name='WinDefend'")
rc = svc.StartService
WScript.Echo rc

此外,我不建议在某个随机时间点将服务状态写入文件,然后尝试根据该文件的内容启动服务。无法保证文件创建后启动模式没有更改,也无法保证服务已经安装。

服务是否应该启动由其StartMode属性指示,所以只需检查那些设置为Auto的服务即可。设置为Manual的服务将由系统按需启动,因此不需要仅仅因为它们在拍摄快照时正在运行就启动它们。

qry = "SELECT * FROM Win32_Service WHERE StartMode='Auto'"
For Each svc In wmi.ExecQuery(qry)
  If Not svc.Started Then svc.StartService
Next

最新更新