Тема: VBScript: перезапуск процесса
В данном примере будут перезапущены все процессы Блокнота (по имени процесса — «notepad.exe»). Основная идея скрипта заключается в использовании свойства «.CommandLine» класса «Win32_Process» WMI:
Option Explicit
Dim strProcessName, lngNewPID
Dim objSWbemServicesEx
Dim collSWbemObjectSet, objSWbemObjectEx
strProcessName = "notepad.exe"
Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & strProcessName & "'", "WQL", 0)
If collSWbemObjectSet.Count > 0 Then
For Each objSWbemObjectEx In collSWbemObjectSet
With objSWbemObjectEx
If .Terminate(0) = 0 Then
If objSWbemServicesEx.Get("Win32_Process").Create(.CommandLine, Null, Nothing, lngNewPID) = 0 Then
WScript.Echo "Процесс [" & .CommandLine & "] перезапущен успешно; ProcessID:" & lngNewPID & "."
Else
WScript.Echo "Не удалось запустить процесс [" & .CommandLine & "]."
End If
Else
WScript.Echo "Не удалось завершить процесс [" & .CommandLine & "]; ProcessID:" & .ProcessID & "."
End If
End With
Next
End If
Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
WScript.Quit 0
Замечания:
* для перезапуска процесса, запущенного не от имени текущего пользователя нужно использовать привилегию «Debug», однако новый процесс будет запущен уже от имени текущего пользователя (подразумевается, что пароль владельца процесса априори неизвестен).
Побочные эффекты:
* вновь запущенный процесс будет иметь текущий каталог, равный каталогу исполняемого файла процесса;
* вновь запущенный процесс будет иметь в качестве родительского процесс «%systemroot%\system32\wbem\wmiprvse.exe».
Автор идеи — Xameleon.