1

Тема: 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.