2013-08-09 2 views
3

Я пытаюсь, чтобы этот сценарий взял текстовый файл и остановил службы перед перезагрузкой и запустил любые службы, которые не запускались автоматически после запуска машины. Сценарий, который получает список имен служб, состояние и startmode и создает текстовый файл с разделителями-запятыми, строчно работает. Здесь для справки (взято из межсетях, потерял ссылку в моих путешествиях немного Modified..):Начальная служба с 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. Имя службы - «WinDefend».

FINAL РАБОЧИЙ КОД:

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.

Что касается кода, то первое, что я бы сделать, это лишить его до минимума, чтобы избежать возможных источников ошибок:

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 = impersonate}! \\" & strComputer & "\ root \ cimv2") Установить objService = objWMIService.get ("Win32_Service.Name = 'WinDefend'") objService.StartService'. Мой тест вчера работал, поэтому я продолжил сценарий. Однако сейчас я запускал свой код и ваш, и я получил ту же ошибку отказа поставщика. – Joe

+0

UPDATE - столкнулся с документом [this] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa394559%28v=vs.85%29.aspx). Если вы просмотрите ошибки, вы увидите первый диапазон кодов ошибок, 80041xx - 8004140 справится с неправильными разрешениями или проблемами с инфраструктурной проблемой WMI. Будет продолжаться обновление, когда я нахожу больше информации. – Joe

+0

Вы прочитали первый абзац моего ответа? –

Смежные вопросы