Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Пользователь


Сообщения: 135
Благодарности: 32

Профиль | Отправить PM | Цитировать


Завершение процессов и служб
Некоторые процессы невозможно завершить с помощью ProcessClose() т.к. они имеют отношение к службам.
А если такой просесс завершить принудительно, (например с помощью консольной команды TASKKILL) то в журнал системных событий записывается сообщение об ошибке, и потом что либо найти в нём с каждым разом становится всё труднее...
Всё это навело меня на мысль написать скрипт:

Код: Выделить весь код
$ProcessName="oodag.exe" ; имя завершаемого процесса
;~ Подключаемся к WMI:
$WMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
$PID = ProcessExists($ProcessName) ;Определяем PID
If $PID Then ProcessClose($PID) ; Если существует - пытаемся убить
If ProcessExists($PID) Then ; Если процесс всё ещё существует тогда
	$OutputName=CheckService($PID) ; проверяем принадлежность процесса к службам (проверку можно пропусить!!!)
	If Not $OutputName=0 Then ; Если является службой тогда
	$Pressed=MsgBox(262144+32+4,"", "Не удалось завершить процесс поскольку"& @CR & _
	"он является запущенной службой: " & $OutputName & @CR & _
	"Остановить службу?")
		If $Pressed=6 Then KillService($PID) ; Если "Да" - останавливаем службу
	EndIf
EndIf

;~ ==================================================
;~ Определяет, является ли процесс запущенной службой (Эту функцию можно исключить!!!)
;~ Если является службой - возвращает "Выводное имя" службы, в противном случае 0
Func CheckService($PrPid)
;~ Формируем текст запроса:
$QueryText = "SELECT * FROM Win32_Service WHERE  ProcessId = '" & $PrPid & "'"
;~ Создаём объект-коллекцию:
$CollectionServices = $WMI.ExecQuery($QueryText)
If $CollectionServices.Count > 0 Then ; Если элементов коллекции > 0 Тогда
	;~ Цикл по элемент(у)ам коллекции:
	For $objItem In $CollectionServices
		Return $objItem.DisplayName
	Next
Else
	Return 0
EndIf 
EndFunc

;~ ==================================================
;~ Останавливает службу, в случае успеха возвращает: 0
Func KillService($PrPID)
;~ Формируем текст запроса:
$QueryText = "SELECT * FROM Win32_Service WHERE  ProcessId = '" & $PrPid & "'"
;~ Создаём объект-коллекцию:
$CollectionServices = $WMI.ExecQuery($QueryText)
If $CollectionServices.Count > 0 Then ; Если элементов коллекции > 0 Тогда
	;~ Цикл по элемент(у)ам коллекции:
	For $objItem In $CollectionServices
		Return $objItem.StopService()
	Next
EndIf
EndFunc

Отправлено: 03:20, 11-05-2007 | #391