Показать полную графическую версию : Завершение процессов кроме, определенных
Подскажите как написать скрипт,который будет закрывать все процессы кроме мною указанных.
например: которые должны работать
svchost.exe
services.exe
ctfmon.exe
explorer.exe
и тд
А все остальные закрыть!
вот похожее
http://forum.oszone.net/showthread.php?t=208639
Anonymоus
28-03-2012, 13:32
O L E G, вот кстати, усовершенствованный вариант скрипта по ссылке ferget, но без WMIC:
@Echo Off
:: Завершает не указанные в "белом списке" процессы
:: Anonymous, 2011
SetLocal EnableDelayedExpansion EnableExtensions
:: Файл со списком разрешённых процессов
Set WhitelistFile=%~sdp0whitelist.txt
:: Получение PID своего процесса
Set WinTitle=%Random%%Random%
Title %WinTitle%
For /F "tokens=2 skip=2 delims=," %%P In ('tasklist /FI "WINDOWTITLE eq %WinTitle%" /FO CSV') Do (Set MyPID=%%~P)
Title %~n0
:: Чтение файла со списком разрешённых процессов
If Exist "%WhitelistFile%" (
For /F "tokens=*" %%w In (%WhitelistFile%) Do (Set WhiteList=%%w:!WhiteList!)
) Else (
Set WhiteList=explorer.exe:csrss.exe:ctfmon.exe:lsass.exe:services.exe:smss.exe:svchost.exe:tasklist.exe :taskmgr.exe:winlogon.exe:wmiprvse.exe:
)
:: Получение списка процессов (без дублей)
For /F "tokens=1 skip=5 delims=," %%p In ('tasklist /FO CSV') Do (Echo :!ProcList!|Find /I ":%%~p:">nul||Set ProcList=%%~p:!ProcList!)
:: Сравнение списков
:Compare
For /F "tokens=1,* delims=:" %%C In ("!ProcList!") Do (
If Not "%%C"=="" (
Echo :!WhiteList!|Find /I ":%%C:">nul||Call :Kill "%%C"
Set ProcList=%%D
GoTo Compare
)
)
Exit
:: Завершение процессов
:Kill
If "%~1"=="cmd.exe" (
TaskKill /F /FI "PID ne %MyPID%" /FI "IMAGENAME eq cmd.exe"
) Else (
TaskKill /F /IM "%~1"
)
Exit /B
Покажите пожалуйста оптимальный вариант "белого списка" для Windows XP.
Anonymоus
28-03-2012, 18:56
sov44,
Вот мой, ничего лишнего. Но помните, что набор зависит от установленных у вас служб, работающих в фоновом режиме программ, и т.д. - это сугубо персональное дело.
AIMP2.exe опционально
bash.exe опционально
explorer.exe
console.exe опционально
csrss.exe
ctfmon.exe
firefox.exe опционально
lsass.exe
psi-plus.exe опционально
services.exe
smss.exe
svchost.exe
tasklist.exe
taskmgr.exe
VistaDrv.exe опционально
winlogon.exe
wmiprvse.exe
извените ребят но мне надо что бы через VBS файл запускался а не через командную строку, перепишите плиз
Примерно так:
Option Explicit
Dim arrProcesses
Dim strComputer
Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx
Dim objSWbemEventSource
Dim lngThisScriptProcessID
arrProcesses = Array("svchost.exe", "services.exe", "ctfmon.exe", "explorer.exe")
strComputer = "."
Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
objSWbemLocator.Security_.Privileges.AddAsString "SeDebugPrivilege", True
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
lngThisScriptProcessID = GetScriptProcessID(objSWbemServicesEx)
For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Process")
With objSWbemObjectEx
If Not (IsProcessEnabled(arrProcesses, .Name) Or .ProcessID = lngThisScriptProcessID) Then
If .Terminate() = 0 Then
'WScript.Echo .Name, "Terminate"
End If
End If
End With
Next
Set objSWbemEventSource = objSWbemServicesEx.ExecNotificationQuery( _
"SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
Do
With objSWbemEventSource.NextEvent().TargetInstance
If Not IsProcessEnabled(arrProcesses, .Name) Then
If .Terminate() = 0 Then
'WScript.Echo .Name, "Terminate"
End If
End If
End With
Loop
Set objSWbemEventSource = Nothing
Set objSWbemObjectEx = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing
WScript.Quit 0
'=============================================================================
'=============================================================================
Function IsProcessEnabled(arrProcesses(), strProcess)
Dim elem
IsProcessEnabled = False
For Each elem In arrProcesses
If UCase(strProcess) = UCase(elem) Then
IsProcessEnabled = True
Exit For
End If
Next
End Function
'=============================================================================
'=============================================================================
Function GetScriptProcessID(objSWbemServicesEx)
Dim strPath
strPath = """mshta.exe"" " & _
"""<HTML><HEAD><HTA:APPLICATION APPLICATIONNAME='GetParentPID' " & _
"WINDOWSTATE='minimize' SHOWINTASKBAR='no'</HEAD></HTML>"""
With WScript.CreateObject("WScript.Shell").Exec(strPath)
GetScriptProcessID = objSWbemServicesEx.Get("Win32_Process.Handle='" & CStr(.ProcessID) &"'").ParentProcessID
.Terminate
End With
End Function
'=============================================================================
Перед запуском убедитесь, что Вы сохранили все данные: поскольку Вы перечислили не все необходимые для нормальной работы процессы, а я не стал расшифровывать Ваше «и тд», результатом снятия одной из системных служб станет немедленная перезагрузка ОС.
Проверил скрипт работает но вылает такая ошибка
сторка 28
символ 4
ошибка: Сбой при удаленном вызове процедуры
источник: SWbemOmjectEx
конечно можно фильтр ошибок поставить, но ошибка эта важная?
O L E G, приношу Вам свои извинения. У меня эти строки были закомментированы, поскольку я делал только вывод имени процесса для завершения.
Я поправил код в своём предыдущем посте. Пробуйте.
Iska, Да ладно можно без извенений,вы же мне не обязаны)) я понимаю
перепроверил такая же ошибка по этому адрессу
O L E G, проверил, работает. Приведите код, который используете Вы.
Option Explicit
Dim arrProcesses
Dim strComputer
Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx
Dim objSWbemEventSource
Dim lngThisScriptProcessID
arrProcesses = Array("svchost.exe", "services.exe", "ctfmon.exe", "explorer.exe", "winlogon.exe", "csrss.exe", "lsass.exe", "smss.exe")
strComputer = "."
Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
objSWbemLocator.Security_.Privileges.AddAsString "SeDebugPrivilege", True
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
lngThisScriptProcessID = GetScriptProcessID(objSWbemServicesEx)
For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Process")
With objSWbemObjectEx
If Not (IsProcessEnabled(arrProcesses, .Name) Or .ProcessID = lngThisScriptProcessID) Then
If .Terminate() = 0 Then
'WScript.Echo .Name, "Terminate"
End If
End If
End With
Next
Set objSWbemEventSource = objSWbemServicesEx.ExecNotificationQuery( _
"SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
Do
With objSWbemEventSource.NextEvent().TargetInstance
If Not IsProcessEnabled(arrProcesses, .Name) Then
If .Terminate() = 0 Then
'WScript.Echo .Name, "Terminate"
End If
End If
End With
Loop
Set objSWbemEventSource = Nothing
Set objSWbemObjectEx = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing
WScript.Quit 0
'=============================================================================
'=============================================================================
Function IsProcessEnabled(arrProcesses(), strProcess)
Dim elem
IsProcessEnabled = False
For Each elem In arrProcesses
If UCase(strProcess) = UCase(elem) Then
IsProcessEnabled = True
Exit For
End If
Next
End Function
'=============================================================================
'=============================================================================
Function GetScriptProcessID(objSWbemServicesEx)
Dim strPath
strPath = """mshta.exe"" " & _
"""<HTML><HEAD><HTA:APPLICATION APPLICATIONNAME='GetParentPID' " & _
"WINDOWSTATE='minimize' SHOWINTASKBAR='no'</HEAD></HTML>"""
With WScript.CreateObject("WScript.Shell").Exec(strPath)
GetScriptProcessID = objSWbemServicesEx.Get("Win32_Process.Handle='" & CStr(.ProcessID) &"'").ParentProcessID
.Terminate
End With
End Function
Код обрамляется тэгом «code (http://forum.oszone.net/misc.php?do=bbcode#code)».
В появляющемся окне об ошибке нажмите «Ctrl-C», и результат копирования также вставьте из буфера обмена сюда.
---------------------------
Windows Script Host
---------------------------
Сценарий: C:\Documents and Settings\Admin\Рабочий стол\12.vbs
Строка: 28
Символ: 4
Ошибка: Сбой при удаленном вызове процедуры.
Код: 800706BE
Источник: SWbemObjectEx
---------------------------
ОК
---------------------------
ошибка вылазиет не всегда,но вылазиет
O L E G, Вы действительно используете:
strComputer = "."
или таки по сети работаете?
Давайте попробуем вставить ради эксперимента некоторое ожидание вслед за получением PID скрипта:
lngThisScriptProcessID = GetScriptProcessID(objSWbemServicesEx)
WScript.Sleep 5000
Iska,
использую
strComputer = "."
использую,работаю не по сети
пробовал
lngThisScriptProcessID = GetScriptProcessID(objSWbemServicesEx)
WScript.Sleep 5000
вылазиет такая же ошибка
Petya V4sechkin
30-03-2012, 16:43
O L E G, замените в двух местах фрагмент:
If .Terminate() = 0 Then
'WScript.Echo .Name, "Terminate"
End If
на:
WScript.Echo .Name, "Попытка завершения"
If .Terminate() = 0 Then
WScript.Echo .Name, "Terminate"
End If
После какого процесса выдаст ошибку?
---------------------------
Windows Script Host
---------------------------
Сценарий: C:\Documents and Settings\Admin\Рабочий стол\12.vbs
Строка: 29
Символ: 4
Ошибка: Не найден
Код: 80041002
Источник: SWbemObjectEx
---------------------------
ОК
---------------------------
O L E G, даже ни одного имени процесса не выдал? Сразу в ошибку выпал?
Добавьте-ка в arrProcesses — «System Idle Process» и «System».
извени ребят ,я не успел посмотреть после какого процесса ошибка выскачила но она была.конец рабочего дня был не успел,в понедельник все будет
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.