用VBscript启动服务

用VBscript启动服务,vbscript,wmi,Vbscript,Wmi,我正试图让这个脚本在重新启动前获取一个正在运行的文本文件并停止服务,然后启动任何在机器启动后未自动启动的服务。获取服务名称、状态和startmode列表并逐行创建逗号分隔的文本文件的脚本工作正常。这里是供参考的(摘自互联网站,在我的旅行中丢失了链接,稍作修改): 下一位逐行读取文件,将所有服务的状态与机器关闭前记录的服务状态进行比较。如果它们匹配,则不执行任何操作;如果它们不同,则启动服务: Const ForReading = 1 strComputer = "." Set objWMISer

我正试图让这个脚本在重新启动前获取一个正在运行的文本文件并停止服务,然后启动任何在机器启动后未自动启动的服务。获取服务名称、状态和startmode列表并逐行创建逗号分隔的文本文件的脚本工作正常。这里是供参考的(摘自互联网站,在我的旅行中丢失了链接,稍作修改):

下一位逐行读取文件,将所有服务的状态与机器关闭前记录的服务状态进行比较。如果它们匹配,则不执行任何操作;如果它们不同,则启动服务:

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
Const ForReading=1
strComputer=“”
设置objWMIService=GetObject(“winmgmts:&“{impersonationLevel=impersonate}!\\”&strComputer&“\root\cimv2”)
设置objServiceName=objWMIService.get(“Win32_Service.Name=”&ServiceName&“”)
设置objFSO=CreateObject(“Scripting.FileSystemObject”)
设置objFile=objFSO.OpenTextFile(\\some path\service\u list.txt),用于读取,True,-2)
直到objFile.AtEndOfStream
fLine=Split(objFile.ReadLine,“,”)
'wscript.echo fLine(2)
如果仪表(弗林(2),“运行”),则
“wscript.echo”它正在运行
如果objServiceName.Started那么
“什么也不做
其他的
'Set servicetostart=objWMIService.ExecQuery(“从Win32_服务中选择”&ServiceName&“其中Name='Alerter'))
'servicetostart.StartService()
'Result=objServiceName.StartService
'如果结果为0,则
'wscript.echo“开始”&ServiceName&“错误:&Result”
"完"
objServiceName.StartService
“wscript.echo Servicename&”无法以错误开头:“&Result”
如果结束
如果结束
'wscript.echo objServiceName
环
从现在起,每当它实际尝试启动服务时,我都会收到一个错误。我收到“提供程序故障代码:80041004来源:SWbemObjectEX”。我一直在浏览有关此错误的帖子,并尝试建议的修复方法。此外,正如你们所看到的,我一直在尝试各种变化,但我恐怕我只是在猜测

那么对于我的问题,是什么导致了“提供者失败”?我在这里查找了Win32_服务类的这些信息:

在这里查找方法:

但我一直无法找出我错在哪里

谢谢

另一方面,我正在测试的服务(即确保服务正在启动、创建文本文件、然后停止服务并运行“启动服务”代码)是Windows Defender。服务名称为“windefind”

最终工作代码:

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
Const ForReading=1
strComputer=“”
设置objWMIService=GetObject(“winmgmts:&“{impersonationLevel=impersonate}!\\”&strComputer&“\root\cimv2”)
设置objFSO=CreateObject(“Scripting.FileSystemObject”)
设置objFile=objFSO.OpenTextFile(\\vmware host\Shared Folders\Documents\Biffduncan\Monthly Server maintance\service\u list.txt),用于读取,为True,-2)
直到objFile.AtEndOfStream
fLine=Split(objFile.ReadLine,“,”)
设置objService=objWMIService.get(“Win32_Service.Name=”&fLine(0)&“”)
如果仪表(弗林(2),“运行”),则
“wscript.echo”它正在运行
如果objService.startedthen
“什么也不做
其他的
结果=objService.StartService()
如果结果为0,则
wscript.echo“服务:&objService.Name&”没有以错误:&Result开头
其他的
wscript.echo“服务”&objService.Name&“已启动”
如果结束
如果结束
如果结束
环

错误代码0x80041004表示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

谢谢你的回复。昨天,我尝试使用自己的代码启动和停止该服务。
strComputer=“.Set objWMIService=GetObject(“winmgmts:”&“{impersonationLevel=impersonate}!\\”&strComputer&“\root\cimv2”)Set objService=objWMIService.get(“Win32\u service.Name='windefind'))objService.StartService
。我昨天的测试成功了,所以我继续写剧本。不过,我刚才运行了我的代码和您的代码,得到了相同的提供程序失败错误。更新-遇到文档。如果查看错误,您将看到第一个错误代码范围,80041xx-8004140处理不正确的权限或WMI基础结构问题。当我找到更多信息时,将继续更新。是的,但是你没有提供参考,我只是想澄清一下。我确实运行了WMIDiag,但它返回时显示“WMIDiag检测到会导致WMI无法正常工作的问题”。我目前正在查看日志,试图找到原因。错误的原因如下:Set-objService=objWMIService.get(“Win32_-Service.Name=”&ServiceName&“”)。如果我将行更改为:
qry = "SELECT * FROM Win32_Service WHERE StartMode='Auto'"
For Each svc In wmi.ExecQuery(qry)
  If Not svc.Started Then svc.StartService
Next