"Стряпал" я для себя когда-то нечто подобное. Вот оставшиеся черновики.
1. Перезапуск (НЕ В ИНТЕРАКТИВНОМ РЕЖИМЕ) процесса, если он остановлен.
Dim objWMI, objCollection, objInstance
Dim strComputer, strTemp, intErr, intProcID
Const strProcess = "process.exe"
strComputer = "station"
intErr = 0
If Connection(strComputer) Then
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objCollection = objWMI.ExecQuery("SELECT Name FROM Win32_Process WHERE Name='" & strProcess & "'")
If objCollection.Count = 0 Then
Set objInstance = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2:Win32_Process")
intErr = objInstance.Create(strProcess, null, null, intProcID)
If intErr = 0 Then
WScript.Echo "Процесс на станции " & UCase(strComputer) & " запущен. Его ID: " & intProcID
Else
WScript.Echo "Ошибка запуска процесса на станции " & UCase(strComputer) & ". Код ошибки: " & intErr
WScript.Quit
End If
Else
WScript.Echo "Процесс на станции " & UCase(strComputer) & " уже запущен."
End If
On Error Resume Next
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objCollection = objWMI.ExecNotificationQuery("SELECT * FROM __InstanceDeletionEvent " & _
"WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name='" & strProcess & "'")
If Err.Number = 0 Then
Do
Set objItem = objCollection.NextEvent
If Err.Number = 0 Then
strTemp = objItem.TargetInstance.Name
If StrComp(strTemp, strProcess, vbTextCompare) = 0 Then
Set objInstance = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2:Win32_Process")
intErr = objInstance.Create(strProcess, null, null, intProcID)
If intErr = 0 Then
WScript.Echo "Процесс на станции " & UCase(strComputer) & " перезапущен. Его ID: " & _
intProcID
Else
WScript.Echo "Ошибка запуска процесса на станции " & UCase(strComputer) & _
". Код ошибки: " & intErr
End If
End If
Else
WScript.Echo "Ошибка работы сценария для станциии " & UCase(strComputer) & vbNewLine & _
"Код ошибки: " & Err.Number & vbNewLine & Err.Description
WScript.Quit
End If
Loop
Else
WScript.Echo "Ошибка работы сценария для станциии " & UCase(strComputer) & vbNewLine & _
"Код ошибки: " & Err.Number & vbNewLine & Err.Description
WScript.Quit
End If
Else
WScript.Echo "Станция " & UCase(strComputer) & " не отвечает."
End If
Function Connection(strWS)
Dim objCollection, objItem
On Error Resume Next
Set objCollection = GetObject("winmgmts:{impersonationLevel=impersonate}")._
ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address='" & strWS & "'")
For Each objItem In objCollection
If IsNull(objItem.StatusCode) Or objItem.StatusCode <> 0 Then
Connection = False
Else
Connection = True
End If
Next
End Function
2. Перезапуск (В ИНТЕРАКТИВНОМ РЕЖИМЕ) процесса, если он остановлен.
Dim objWMI, objCollection, objInstance
Dim strComputer, strTemp, intErr, intProcID
Dim strRunTime
Const strProcess = "process.exe"
strComputer = "station"
intErr = 0
intRestartTime = 1
If Connection(strComputer) Then
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objCollection = objWMI.ExecQuery("SELECT Name FROM Win32_Process WHERE Name='" & strProcess & "'")
If objCollection.Count = 0 Then
Set objInstance = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2:Win32_ScheduledJob")
strRunTime = "********" & Replace(Left(DateAdd("n", intRestartTime, Time), 8), ":", "") & ".000000+360"
intErr = objInstance.Create(strProcess, strRunTime, False,,, True)
Set objInstance = Nothing
If intErr = 0 Then
WScript.Echo "Задание на запуск процесса на станции " & UCase(strComputer) & " назначено."
Else
WScript.Echo "Ошибка назначения задания на запуск процесса на станции " & _
UCase(strComputer) & ". Код ошибки: " & intErr
Set objCollection = Nothing
Set objWMI = Nothing
WScript.Quit
End If
Else
WScript.Echo "Процесс на станции " & UCase(strComputer) & " уже запущен."
End If
On Error Resume Next
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objCollection = objWMI.ExecNotificationQuery("SELECT * FROM __InstanceDeletionEvent " & _
"WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name='" & strProcess & "'")
If Err.Number = 0 Then
Do
Set objItem = objCollection.NextEvent
If Err.Number = 0 Then
strTemp = objItem.TargetInstance.Name
If StrComp(strTemp, strProcess, vbTextCompare) = 0 Then
Set objInstance = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2:Win32_ScheduledJob")
strRunTime = "********" & Replace(Left(DateAdd("n", intRestartTime, Time), 8), ":", "") & ".000000+360"
intErr = objInstance.Create(strProcess, strRunTime, False,,, True, intProcID)
Set objInstance = Nothing
If intErr = 0 Then
WScript.Echo "Задание на перезапуск процесса на станции " & UCase(strComputer) & _
" назначено."
Else
WScript.Echo "Ошибка назначения задания на перезапуск процесса на станции " & _
UCase(strComputer) & ". Код ошибки: " & intErr
Set objCollection = Nothing
Set objWMI = Nothing
WScript.Quit
End If
End If
Else
WScript.Echo "Ошибка работы сценария для станциии " & UCase(strComputer) & vbNewLine & _
"Код ошибки: " & Err.Number & vbNewLine & Err.Description
Set objCollection = Nothing
Set objWMI = Nothing
WScript.Quit
End If
Loop
Else
WScript.Echo "Ошибка работы сценария для станциии " & UCase(strComputer) & vbNewLine & _
"Код ошибки: " & Err.Number & vbNewLine & Err.Description
Set objCollection = Nothing
Set objWMI = Nothing
WScript.Quit
End If
Else
WScript.Echo "Станция " & UCase(strComputer) & " не отвечает."
End If
Function Connection(strWS)
Dim objCollection, objItem
On Error Resume Next
Set objCollection = GetObject("winmgmts:{impersonationLevel=impersonate}")._
ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address='" & strWS & "'")
For Each objItem In objCollection
If IsNull(objItem.StatusCode) Or objItem.StatusCode <> 0 Then
Connection = False
Else
Connection = True
End If
Next
Set objCollection = Nothing
End Function
Примечания для интерактивного варианта:
- обязательно надо учитывать часовой пояс и "зимнее"|"летнее" время (в черновике - "зимнее" для часового пояса Новосибирска);
- минимальный интервал времени, через который может быть перезапущен процесс, составляет 1 минуту.