PDA

Показать полную графическую версию : Завершение процессов кроме, определенных


Страниц : [1] 2 3

O L E G
28-03-2012, 12:33
Подскажите как написать скрипт,который будет закрывать все процессы кроме мною указанных.
например: которые должны работать
svchost.exe
services.exe
ctfmon.exe
explorer.exe
и тд
А все остальные закрыть!

ferget
28-03-2012, 13:02
вот похожее
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

sov44
28-03-2012, 17:18
Покажите пожалуйста оптимальный вариант "белого списка" для 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

O L E G
29-03-2012, 12:07
извените ребят но мне надо что бы через VBS файл запускался а не через командную строку, перепишите плиз

Iska
30-03-2012, 12:40
Примерно так:
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
'=============================================================================
Перед запуском убедитесь, что Вы сохранили все данные: поскольку Вы перечислили не все необходимые для нормальной работы процессы, а я не стал расшифровывать Ваше «и тд», результатом снятия одной из системных служб станет немедленная перезагрузка ОС.

O L E G
30-03-2012, 12:58
Проверил скрипт работает но вылает такая ошибка
сторка 28
символ 4
ошибка: Сбой при удаленном вызове процедуры
источник: SWbemOmjectEx


конечно можно фильтр ошибок поставить, но ошибка эта важная?

Iska
30-03-2012, 13:05
O L E G, приношу Вам свои извинения. У меня эти строки были закомментированы, поскольку я делал только вывод имени процесса для завершения.

Я поправил код в своём предыдущем посте. Пробуйте.

O L E G
30-03-2012, 13:17
Iska, Да ладно можно без извенений,вы же мне не обязаны)) я понимаю
перепроверил такая же ошибка по этому адрессу

Iska
30-03-2012, 15:19
O L E G, проверил, работает. Приведите код, который используете Вы.

O L E G
30-03-2012, 15:28
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

Iska
30-03-2012, 16:03
Код обрамляется тэгом «code (http://forum.oszone.net/misc.php?do=bbcode#code)».

В появляющемся окне об ошибке нажмите «Ctrl-C», и результат копирования также вставьте из буфера обмена сюда.

O L E G
30-03-2012, 16:15
---------------------------
Windows Script Host
---------------------------
Сценарий: C:\Documents and Settings\Admin\Рабочий стол\12.vbs
Строка: 28
Символ: 4
Ошибка: Сбой при удаленном вызове процедуры.
Код: 800706BE
Источник: SWbemObjectEx

---------------------------
ОК
---------------------------


ошибка вылазиет не всегда,но вылазиет

Iska
30-03-2012, 16:29
O L E G, Вы действительно используете:
strComputer = "."
или таки по сети работаете?

Давайте попробуем вставить ради эксперимента некоторое ожидание вслед за получением PID скрипта:
lngThisScriptProcessID = GetScriptProcessID(objSWbemServicesEx)
WScript.Sleep 5000

O L E G
30-03-2012, 16:36
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

После какого процесса выдаст ошибку?

O L E G
30-03-2012, 16:49
---------------------------
Windows Script Host
---------------------------
Сценарий: C:\Documents and Settings\Admin\Рабочий стол\12.vbs
Строка: 29
Символ: 4
Ошибка: Не найден
Код: 80041002
Источник: SWbemObjectEx

---------------------------
ОК
---------------------------

Iska
30-03-2012, 17:27
O L E G, даже ни одного имени процесса не выдал? Сразу в ошибку выпал?

Добавьте-ка в arrProcesses — «System Idle Process» и «System».

O L E G
31-03-2012, 10:27
извени ребят ,я не успел посмотреть после какого процесса ошибка выскачила но она была.конец рабочего дня был не успел,в понедельник все будет




© OSzone.net 2001-2012