2013-08-09 2 views
3

이 스크립트는 재부팅하기 전에이 텍스트 파일을 실행 및 중지하고 시스템을 다시 시작한 후에 자동으로 시작되지 않는 서비스를 시작하려고합니다. 서비스 이름, 상태 및 시작 모드의 목록을 가져 와서 줄 단위로 쉼표로 구분 된 텍스트 파일을 만드는 스크립트가 올바르게 작동합니다. 다음은 참조 용입니다 (인터 웹에서 가져온, 내 여행의 링크를 잃은 약간 수정..) :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 & "\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 

이 다음 비트는, 라인하여 파일 라인을 읽어와 모든 서비스의 상태를 비교 컴퓨터가 종료되기 전에 기록 된 서비스 상태. 실제로 서비스를 시작하려고 할 때마다 나는 오류를 잡하고

지금 현재로
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 

: 서로 일치하면, 그들은 다른 경우, 서비스를 시작, 아무것도하지 않습니다. "공급자 실패 코드 : 80041004 원본 : 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"입니다.

최종 작업 CODE :

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 

답변

0

오류 코드 0x80041004가 이미 초기화 된 후 WMI 공급자가 오류가 발생했음을 의미한다. 오류 코드는 오류의 원인에 대해 아무런 언급도하지 않으며 세부 정보도 제공하지 않습니다. WBEMTest 또는 WMIDiag을 실행하여 오류를 추적 해보십시오. 또한 이벤트 로그에서 관련 오류/경고를 확인하십시오. 다른 모든 것이 실패하면 rebuilding the WMI repository을 시도하십시오. I가 서비스 상태를 작성하는 것이 좋습니다 않을 것이다, 또한

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 
+0

감사합니다. 나는 어제 내 자신의 코드'strComputer = "를 사용하여 서비스를 시작하고 중지하려고 시도했다." 세트 objWMIService = GetObject ("winmgmts :"& "{impersonationLevel = 가장)! \\"& strComputer & "\ root \ cimv2") 세트 objService = objWMIService.get ("Win32_Service.Name = 'WinDefend'") objService.StartService'. 어제 제 시험이 효과가 있었기 때문에 나는 대본을 계속 읽었습니다. 그러나 지금은 코드와 코드를 실행했는데 동일한 Provider Failure Error가 발생했습니다. – Joe

+0

업데이트 - [이] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa394559%28v=vs.85%29.aspx) 문서를 발견했습니다. 오류를 살펴보면 오류 코드의 첫 번째 범위 인 80041xx - 8004140이 부적절한 사용 권한을 처리하거나 WMI 인프라 문제와 관련된 문제를 보게됩니다. 더 많은 정보를 찾으면 업데이트가 계속됩니다. – Joe

+0

내 대답의 첫 번째 단락을 읽었습니까? –