Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Завершение процессов кроме, определенных

Ответить
Настройки темы
VBS/WSH/JS - Завершение процессов кроме, определенных

Аватара для O L E G

Старожил


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


Конфигурация

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


Подскажите как написать скрипт,который будет закрывать все процессы кроме мною указанных.
например: которые должны работать
svchost.exe
services.exe
ctfmon.exe
explorer.exe
и тд
А все остальные закрыть!

Отправлено: 12:33, 28-03-2012

 

Ветеран


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

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


Цитата O L E G:
Данный скрипт открывает процесс в подпроцессе Winlogon…»
Нет. Скрипт тут не при чём. См. внимательно сопровождающий текст в #33.

Цитата O L E G:
а можно ли его переписать,что бы открывал как отдельный процесс?не в под процессах? »
Поясните Вашу мысль.

Отправлено: 16:19, 03-04-2012 | #41



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


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

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


Подскажите, как поправить код, чтобы вывести процессы в 3 столбика и убрать их повторы?
Код: Выделить весь код
@echo off
SetLocal EnableDelayedExpansion
For /F "tokens=1 delims=," %%p In ('tasklist /FO CSV^|sort') Do (
Set nam=%%p
if %%p neq "Имя образа" (
Set /A nn +=1
set proc!nn!=%%p
Echo !nn!. !nam:~1,-1!
))
echo.
set /p kill=Введите номер процесса, который нужно завершить:
echo Выбран !proc%kill%!. Уверены?
echo.
pause
taskkill /f /im !proc%kill%! /T
pause>nul

Отправлено: 08:44, 21-05-2012 | #42


Ветеран


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

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


sov44, зачем убирать повторы? Это ведь разные процессы.

Отправлено: 09:43, 21-05-2012 | #43


Ветеран


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

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


Цитата Iska:
sov44, зачем убирать повторы? Это ведь разные процессы. »
Iska, в основном дублируются имена системных процессов(svchost.exe). Их сносить никто не собирается и нет смысла их дублировать. Задача - выловить запущенные пользовательские программы (процессы) и завершить их в случае необходимости.

Отправлено: 10:14, 21-05-2012 | #44


Ветеран


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

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


Тогда так:
Код: Выделить весь код
Option Explicit

Const adVarChar = 200
Const adInteger = 3

Dim strComputer
Dim lngColumnsCount

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx

Dim objWshNetwork

Dim strUserSID
Dim strProcessUserSID
Dim strProcessNumber4Terminate

Dim i


strComputer = "."
lngColumnsCount = 3

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Process WHERE ProcessID <> " & CStr(GetScriptProcessID()) & "")

Set objWshNetwork      = WScript.CreateObject("WScript.Network")

strUserSID = objSWbemServicesEx.Get("Win32_UserAccount.Domain='" & objWshNetwork.UserDomain & "',Name='" & objWshNetwork.UserName & "'").SID

With WScript.CreateObject("ADOR.Recordset")
	With .Fields
		.Append "Name",   adVarChar, 256
		.Append "Handle", adInteger
	End With
	
	.Open
	.Sort = "Name ASC"
	
	For Each objSWbemObjectEx In collSWbemObjectSet
		If objSWbemObjectEx.GetOwnerSid(strProcessUserSID) = 0 Then
			If strUserSID = strProcessUserSID Then
				.AddNew Array("Name", "Handle"), Array(objSWbemObjectEx.Name, objSWbemObjectEx.Handle)
			End If
		End If
	Next
	
	.MoveFirst
	
	Do
		For i = 1 To lngColumnsCount
			If Not .EOF Then
				WScript.StdOut.Write "[" & CStr(.AbsolutePosition) & "] " & Left(.Fields.Item("Name").Value & Space(25), 25) & vbTab
				.MoveNext
			Else
				Exit Do
			End If
		Next
		
		WScript.StdOut.WriteLine
	Loop
	
	Do
		WScript.StdOut.WriteLine
		WScript.StdOut.Write "Введите номер процесса для удаления [1-" & CStr(.RecordCount) & "]:"
		
		strProcessNumber4Terminate = Trim(WScript.StdIn.ReadLine())
		
		If Len(strProcessNumber4Terminate) <> 0 Then
			If IsNumeric(strProcessNumber4Terminate) Then
				If CLng(strProcessNumber4Terminate) >= 1 And CLng(strProcessNumber4Terminate) <= .RecordCount Then
					Exit Do
				Else
					WScript.StdOut.WriteLine "Введённый номер [" & strProcessNumber4Terminate & "] не соответствует ни одному процессу."
				End If
			Else
				WScript.StdOut.WriteLine "Введено не числовое значение."
			End If
		Else
			WScript.StdOut.WriteLine "Отсутствует ввод."
		End If
	Loop
	
	.AbsolutePosition = CLng(strProcessNumber4Terminate)
	
	Set objSWbemObjectEx = objSWbemServicesEx.Get("Win32_Process.Handle=" & CStr(.Fields.Item("Handle").Value) & "")
	
	If objSWbemObjectEx.Terminate() = 0 Then
		WScript.StdOut.WriteLine "Процесс [" & objSWbemObjectEx.Name & "] успешно удалён"
	Else
		WScript.StdOut.WriteLine "Не удалось удалить процесс [" & objSWbemObjectEx.Name & "]"
	End If
	
	Set objSWbemObjectEx = Nothing
	
	.Close
End With

Set objWshNetwork      = Nothing

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Function GetScriptProcessID()
	With WScript.CreateObject("WScript.Shell").Exec( _
		"""mshta.exe"" ""<HTML><HEAD><HTA:APPLICATION APPLICATIONNAME='GetParentPID' " & _
		"WINDOWSTATE='minimize' SHOWINTASKBAR='no'</HEAD></HTML>""" _
	)
		GetScriptProcessID = objSWbemServicesEx.Get("Win32_Process.Handle='" & CStr(.ProcessID) &"'").ParentProcessID
		.Terminate
	End With
End Function
'=============================================================================
Запускать посредством хоста «cscript.exe».

Отправлено: 11:45, 21-05-2012 | #45


Ветеран


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

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


Iska, благодарю, но интересует реализация скрипта в bat.
VBS для меня пока ещё "лес дремучий"
п.с. сорри, что запостил не в той теме.

Последний раз редактировалось sov44, 21-05-2012 в 13:21.


Отправлено: 12:36, 21-05-2012 | #46


Ветеран


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

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


Цитата sov44:
Iska, благодарю, но интересует реализация скрипта в bat. »
Как скажете. А Вы его пробовали?

Цитата sov44:
п.с. сорри, что запостил не в той теме. »
Поскольку Ваш вопрос никак не связан с данной темой, стоило поместить его в отдельную.

Отправлено: 16:12, 21-05-2012 | #47


Ветеран


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

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


Вроде сделал, но пока не получается выстроить ровность столбцов. Нужна подсказка.
Код: Выделить весь код
@echo off
SetLocal EnableDelayedExpansion
For /F "tokens=1 delims=," %%p In ('tasklist /FO CSV^|sort') Do (
Set nam=%%p
if %%p neq "Имя образа" (
Set /A nn +=1
if !nn! LEQ 9 set "nn= !nn!"
set proc!nn!=%%p
set "sort=!nn!. !nam:~1,-1!"
for /f "delims=*" %%a in ("!nn!. !nam:~1,-1!") do (
set "$a=%%a        "
Set /A Cnt += 1
set "$s=!$s!!$a!"& set/a $i+=1
if "!$i!"=="3" echo:!$s!& set "$s="& set/a $i=0
)))
echo.
set /p kill=Введите номер процесса, который нужно завершить:
echo Выбран !proc%kill%!. Уверены?
echo.
pause
taskkill /f /im !proc%kill%! /T
pause>nul

Отправлено: 00:59, 22-05-2012 | #48


Ветеран


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

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


Дополнение справа пробелами Вы уже сделали. Просто обрезайте заданное количество символов, например:
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("Hello World" "Мама мыла раму" "Рабы не мы, мы не рабы") do (
	set sValue=%%~i                            
	set sOut=!sOut!!sValue:~0,20!
)
echo.%sOut%

endlocal
exit /b 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:24, 22-05-2012 | #49


Старожил


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

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


sov44, вот реализация на bat, столбцы ровные, с нумерацией, добавлен ведущий ноль, дубли процессов убраны. Слишком длинные имена обрезаются с добавлением троеточия, но когда скрипт запрашивает подтверждение на убийство процесса, его имя выводится полностью.

Сортировка выполнена через жопу, так пришлось сделать потому, что не хотелось отлавливать system и system idle из прошедшего вначале через sort списка.

Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion

:Main
Set ProcessList=
rem Получаем список процессов без хлама, типа System и System Idle
For /F "skip=3 tokens=1 delims=," %%P In ('tasklist /FO CSV /NH') Do (
rem Убираем повторы, составляем список
	Echo !ProcessList!|Find ":%%~P:">nul||(
		Set ProcessList=!ProcessList!:%%~P:
		Set %%~P=MarkForSorting
	)
)

Set ProcessNum=0&Set Row=0&Set RowData=&Set DisplayNum=0
rem Жуткий костыль с сортировкой, но по другому не вышло бы из-за skip в
rem первом цикле
For /F "tokens=1 delims==" %%P In ('Set^|Sort^|Find "MarkForSorting"') Do (
rem Назначаем номер процессу
	Set /A ProcessNum+=1&Set ProcessNum!ProcessNum!=%%P
	Set Process=%%P
rem Добавление ведущего нуля
	If !ProcessNum! LSS 10 (Set DisplayNum=0!ProcessNum!) Else (Set DisplayNum=!ProcessNum!)
rem Максимальная ширина столбца-1
	If !Row! GTR 2 (
		Echo  !RowData!
		Set Row=1
		Call :Autowidth " !DisplayNum! !Process!"
		Set RowData=!String!
	) Else (
		Set /A Row+=1
		Call :Autowidth " !DisplayNum! !Process!"
		Set RowData=!RowData!!String!
	)
)
rem Вывод остатка строки
Echo  %RowData%

rem Удаление ненужных переменных
For /F "tokens=1 delims==" %%P In ('Set^|Find "MarkForSorting"') Do (Set %%P=)

Echo.
Set /P KillNum=Выберите номер процесса для завершения^> 
Echo.
Echo Вы точно хотите убить процесс #%KillNum% !ProcessNum%KillNum%! ?
Set /P Confirm=[Y\N]^> 
If /I %Confirm%==y (
	TaskKill /F /IM "!ProcessNum%KillNum%!"
rem Без этой задержки в списке иногда появлялись только что убитые процессы
	Ping -n 2 127.0.0.1>nul
	Echo.&Echo.
	GoTo Main
) Else (
	Echo.&Echo.
	GoTo Main
)

rem Автовыравнивание, обрезка длинного имени и добавление '...', если
rem имя процесса не влазит в ширину столбца
:Autowidth
Set String=%~1
If Not "%String:~25%"=="" Set String=%String:~,22%...
:Loop
If "%String:~25%"=="" Set String=%String% &GoTo Loop	
Exit /B

UPD:
Сделал автовыравнивание не на табах, как у меня было, а воспользовался советом Iska и дополнил пробелами.

Последний раз редактировалось Anonymоus, 22-05-2012 в 05:00.

Это сообщение посчитали полезным следующие участники:

Отправлено: 03:10, 22-05-2012 | #50



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Завершение процессов кроме, определенных

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
.NET - Завершение не своих процессов на C# ldcount Программирование и базы данных 4 29-07-2013 14:19
CMD/BAT - Завершение процессов, не указанных в списке Anonymоus Скриптовые языки администрирования Windows 4 05-08-2011 10:33
Разное - Завершение нескольких процессов из CMD или программы antikiller_bm Microsoft Windows 2000/XP 3 24-05-2009 23:39
Заблокировать трафик, кроме определенных IP noleiemit Microsoft Windows NT/2000/2003 17 19-01-2009 21:51
Разное - Неожиданное завершение службы Запуск серверных процессов DCOM koresaram Microsoft Windows 2000/XP 3 25-07-2007 12:20




 
Переход