Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Завершение процессов кроме, определенных (http://forum.oszone.net/showthread.php?t=231478)

O L E G 28-03-2012 12:33 1888426

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

ferget 28-03-2012 13:02 1888457

вот похожее
http://forum.oszone.net/showthread.php?t=208639

Anonymоus 28-03-2012 13:32 1888484

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 1888668

Покажите пожалуйста оптимальный вариант "белого списка" для Windows XP.

Anonymоus 28-03-2012 18:56 1888716

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 1889164

извените ребят но мне надо что бы через VBS файл запускался а не через командную строку, перепишите плиз

Iska 30-03-2012 12:40 1889950

Примерно так:
читать дальше »
Код:

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 1889964

Проверил скрипт работает но вылает такая ошибка
сторка 28
символ 4
ошибка: Сбой при удаленном вызове процедуры
источник: SWbemOmjectEx


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

Iska 30-03-2012 13:05 1889969

O L E G, приношу Вам свои извинения. У меня эти строки были закомментированы, поскольку я делал только вывод имени процесса для завершения.

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

O L E G 30-03-2012 13:17 1889980

Iska, Да ладно можно без извенений,вы же мне не обязаны)) я понимаю
перепроверил такая же ошибка по этому адрессу

Iska 30-03-2012 15:19 1890071

O L E G, проверил, работает. Приведите код, который используете Вы.

O L E G 30-03-2012 15:28 1890081

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 1890096

Код обрамляется тэгом «code».

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

O L E G 30-03-2012 16:15 1890111

Код:

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

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

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

Iska 30-03-2012 16:29 1890128

O L E G, Вы действительно используете:
Код:

strComputer = "."
или таки по сети работаете?

Давайте попробуем вставить ради эксперимента некоторое ожидание вслед за получением PID скрипта:
Код:

lngThisScriptProcessID = GetScriptProcessID(objSWbemServicesEx)
WScript.Sleep 5000


O L E G 30-03-2012 16:36 1890136

Iska,
использую
Код:

strComputer = "."
использую,работаю не по сети


пробовал
Код:

lngThisScriptProcessID = GetScriptProcessID(objSWbemServicesEx)
WScript.Sleep 5000

вылазиет такая же ошибка

Petya V4sechkin 30-03-2012 16:43 1890143

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 1890146

Код:

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

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


Iska 30-03-2012 17:27 1890184

O L E G, даже ни одного имени процесса не выдал? Сразу в ошибку выпал?

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

O L E G 31-03-2012 10:27 1890563

извени ребят ,я не успел посмотреть после какого процесса ошибка выскачила но она была.конец рабочего дня был не успел,в понедельник все будет

O L E G 02-04-2012 09:47 1891750

процесс MSHTA.exe -его не удалось завершить


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

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

O L E G 02-04-2012 10:19 1891757

Код:

arrProcesses = Array("svchost.exe", "services.exe", "ctfmon.exe", "explorer.exe", "system.exe", "winlogon.exe", "smss.exe", "csrss.exe", "lsass.exe", "mshta.exe", "ntoskrnl.exe", "wmiprvse.exe" )
ошибка была из за "mshta.exe" "wmiprvse.exe" процессов
добавил эти процессы вроде закрывается без каких либо ошибок,но мне интересно ,с этим скриптом могут возникнуть проблемы на других машинах?

Iska 02-04-2012 11:02 1891771

Если добавить некоторое ожидание после получения PID скрипта — «mshta.exe», думаю, можно будет исключить: он используется только в начале скрипта и далее не используется. «wmiprvse.exe» — это служба самого Wbem, без неё, конечно, никак.

Цитата:

Цитата O L E G
мне интересно ,с этим скриптом могут возникнуть проблемы на других машинах? »

Со скриптом — вряд ли, со списком «arrProcesses» — могут.

А какова была конечная Ваша цель, и почему Вы не захотели использовать политики ограниченного использования программ?

O L E G 02-04-2012 11:08 1891774

Нашел один косяк, после запуска скрипта те проргаммы что не в списке не возможно открыть, они автоматически закрываются,такую чувство что скрипт в процессах висит и закрывает приложения,в чем проблема может быть

Как и ранее я хотел сделать программу которая меняет данные ресстра и удалеет банеры при Включенной системе,
1. я сделал что бы скрипт запускался по нажатию Win+F1
2. сделал что скрипт запускается через пол часа как заставка, что мне дает 100% гарантию закрытия всех процессов и Explorer и винлокеров и восстановить его заново Explorer.
3. скрипт даже работает по верх Win+L блокировки системы,как бы запускает 2 рабочий стола по верх Блокировщика,что дает возможность изменить реестр и так далее,от вирусов и локеров при активной системы


Теперь мне все данные надо соединить в один фунциональный файл и все перепроверить

Iska 02-04-2012 11:33 1891787

Цитата:

Цитата O L E G
Нашел один косяк, после запуска скрипта те проргаммы что не в списке не возможно открыть, они автоматически закрываются,такую чувство что скрипт в процессах висит и закрывает приложения,в чем проблема может быть »

Это не косяк, и не проблема, а именно то, что Вы просили.

Если Вам сие не нужно — удалите эту часть:
Код:

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

скрипта.

Цитата:

Цитата O L E G
что мне дает 100% гарантию закрытия всех процессов »

Не даёт.

O L E G 02-04-2012 11:39 1891790

Не правильно избяснил мысль,не всех процессов,а тех что не всписке.
1.Заблокировал винлокер систему не возможно что либо запустить
2. мой скрипт через определенное время срабатывает,блокирует полностью автозапуск, исправляет Winlogon,Police и тд
3. Закрывает процессы что не всписке и Explorer то же,открывает его заново,тем самым уже без винлокера и у нас есть доступ к реестру и остальным данных
4. даже если мы системы перезагрузим,у нас будет всеравно заблокирован автозапуск и почишены ветви,тем самым неоткуда будет локеру запуститься

Iska 02-04-2012 11:43 1891794

Я сталкивался с такими случаями инфекций:

* служба, в свойствах которой указана немедленная перезагрузка ОС в случае её завершения;
* несколько процессов, каждый из которых следит за наличием остальных и, в случае их отсутствия — немедленно их запускает и восстанавливает пути и методы их запуска.

Потому вывод: лучший способ чистить ОС — чистить её не из-под неё самой.

O L E G 02-04-2012 11:48 1891796

Думаю, если по сидеть по думать, то все таки перехитрить можно Локеров
Или с помошью Безопасности Заблокировать доступ к веткам, откуда грузиться локер,закрыть процессы, тем самым он незапуститься, а пути в реестре уже не найдет

Iska 02-04-2012 12:14 1891810

O L E G, для одного, конкретного, вируса практически всегда можно подобрать набор определённых действий, ведущих к искомой цели.

O L E G 02-04-2012 12:27 1891821

вопрос, но не по этой теме, скрипт запускается как скрин сейвер через определеноое время,он закрывает Explorer и заново его открывает. Проблема в чем! невозможно закрыть Explorer во 2 раз,так как он находиться в под процессе как его можно закрыть
До wscript.exe, есть еще один процессе но я его не добавил в скрин

Iska 02-04-2012 13:44 1891868

O L E G, как Вы запускаете «explorer.exe»?

O L E G 02-04-2012 14:06 1891885

Код:

wsh.run "Explorer.exe" или wsh.run "Explorer.exe", 0 ,True
или
Код:

wsh.run "Taskkill /IM Explorer.exe /F", 0 ,True
wsh.run "Explorer.exe"


Iska 02-04-2012 16:35 1891991

O L E G, вот Вам пример для Блокнота:
читать дальше »
Код:

Option Explicit

Dim strProcess
Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx

Dim lngProcessID


strProcess  = "notepad.exe"
strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

If objSWbemServicesEx.Get("Win32_Process").Create(strProcess, Null, Nothing, lngProcessID) = 0 Then
        WScript.Echo "Process [" & strProcess & "] create successfully, Process ID is [" & lngProcessID & "]."
       
        WScript.Sleep 3000
       
        If objSWbemServicesEx.Get("Win32_Process.Handle='" & CStr(lngProcessID) & "'").Terminate() = 0 Then
                WScript.Echo "Process [" & strProcess & "], Process ID [" & lngProcessID & "] terminate successfully."
        Else
                WScript.Echo "Can't terminate process [" & strProcess & "], Process ID [" & lngProcessID & "]."
        End If
Else
        WScript.Echo "Can't create process [" & strProcess & "]."
End If

Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0


Пытаемся запустить Блокнот, в случае успеха ждём три секунды, пытаемся закрыть тот экземпляр Блокнота, который запустили.

В случае же Проводника не всё так однозначно. Во-первых, процесс Проводника может существовать как в единственном экземпляре, так и в двух — когда настройками указано разделять процессы Проводника «Рабочего стола» и папок (вторичные входы здесь не рассматриваем). Во-вторых, если просто попытаться завершить процесс «Рабочего стола» Проводника — «Программа входа в систему Windows NT» (winlogon.exe) его попросту перезапустит (справедливо, по крайней мере для WIndows XP). Отменить подобное поведение можно, указав ненулевое значение «Reason» при вызове метода «.Terminate(Reason)».

К тому же, я совсем не понял, зачем снимать процесс, запускать процесс и снова снимать его. Ну, и, утверждение:
Цитата:

Цитата O L E G
невозможно закрыть Explorer во 2 раз,так как он находиться в под процессе »

не верно.

O L E G 02-04-2012 16:40 1891994

к примеру у тебя стоит блокировка win + L, если снять процесс explorer и запустить его заново он будет по верх этой блокировки,что нам даст полное дествие над ПК

Iska 02-04-2012 17:01 1892014

Цитата:

Цитата O L E G
к примеру у тебя стоит блокировка win + L, если снять процесс explorer и запустить его заново он будет по верх этой блокировки,что нам даст полное дествие над ПК »

«он будет по верх этой блокировки» — не подтверждаю.

O L E G 02-04-2012 17:03 1892015

я пробовал! работает)) 100% поэтому я и задался этим вопросом

Iska 02-04-2012 17:36 1892035

Значит, это не есть:
Цитата:

Цитата O L E G
блокировка win + L »


O L E G 02-04-2012 17:43 1892038

Iska, а вот с этим скриптом что ты мне дал на примере Блокнотапо верх Блокировки не вылазиет, пытался изменить но выдает ошибку
Код:

---------------------------
Windows Script Host
---------------------------
Сценарий:        C:\Documents and Settings\Admin\Рабочий стол\cmd\vbs\Программа KeyRepair\unlock\служба восстановления реестра\запуск и завершение процесса\Копия 1.vbs
Строка:        24
Символ:        2
Ошибка:        Не найден
Код:        80041002
Источник:        SWbemServicesEx

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


оставлял только закрытие процесса.
Код:

Option Explicit

Dim strProcess
Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx

Dim lngProcessID


strProcess  = "explorer.exe"


Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")



       
       
        WScript.Sleep 3000
       
        If objSWbemServicesEx.Get("Win32_Process.Handle='" & CStr(lngProcessID) & "'").Terminate() = 0 Then
               
        Else
                WScript.Echo "Can't terminate process [" & strProcess & "], Process ID [" & lngProcessID & "]."
        End If

        WScript.Echo "Can't create process [" & strProcess & "]."


Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0


а открывал по своему
Код:

wsh.run "Explorer.exe"

Iska 02-04-2012 19:28 1892111

Вы убрали код для запуска процесса и получения его идентификатора, а затем пытаетесь применить неинициализированную PID'ом (стало быть — нулевую) переменную «lngProcessID» для получения экземпляра процесса с последующим его закрытием.

Не удивительно, что это не работает, ибо в терминах Wbem процесс с нулевым PID'ом — это «System Idle Process» — «ожидание» системы.

O L E G 03-04-2012 10:14 1892381

Код:

Option Explicit

Dim strProcess
Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx

Dim lngProcessID


strProcess  = "Explorer.exe"
strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

If objSWbemServicesEx.Get("Win32_Process").Create(strProcess, Null, Nothing, lngProcessID) = 0 Then
        WScript.Echo "Process [" & strProcess & "] create successfully, Process ID is [" & lngProcessID & "]."
       
        WScript.Sleep 3000
       
        If objSWbemServicesEx.Get("Win32_Process.Handle='" & CStr(lngProcessID) & "'").Terminate() = 0 Then
                WScript.Echo "Process [" & strProcess & "], Process ID [" & lngProcessID & "] terminate successfully."
        Else
                WScript.Echo "Can't terminate process [" & strProcess & "], Process ID [" & lngProcessID & "]."
        End If
Else
        WScript.Echo "Can't create process [" & strProcess & "]."
End If

Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0

Данный скрипт открывает процесс в подпроцессе Winlogon, а можно ли его переписать,что бы открывал как отдельный процесс?не в под процессах?

Iska 03-04-2012 16:19 1892661

Цитата:

Цитата O L E G
Данный скрипт открывает процесс в подпроцессе Winlogon…»

Нет. Скрипт тут не при чём. См. внимательно сопровождающий текст в #33.

Цитата:

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

Поясните Вашу мысль.

sov44 21-05-2012 08:44 1919650

Подскажите, как поправить код, чтобы вывести процессы в 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


Iska 21-05-2012 09:43 1919676

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

sov44 21-05-2012 10:14 1919689

Цитата:

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

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

Iska 21-05-2012 11:45 1919743

Тогда так:
Код:

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».

sov44 21-05-2012 12:36 1919784

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

Iska 21-05-2012 16:12 1919930

Цитата:

Цитата sov44
Iska, благодарю, но интересует реализация скрипта в bat. »

Как скажете. А Вы его пробовали?

Цитата:

Цитата sov44
п.с. сорри, что запостил не в той теме. »

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

sov44 22-05-2012 00:59 1920143

Вроде сделал, но пока не получается выстроить ровность столбцов. Нужна подсказка.
Код:

@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


Iska 22-05-2012 01:24 1920144

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

@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


Anonymоus 22-05-2012 03:10 1920162

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 и дополнил пробелами.


Время: 19:27.

Время: 19:27.
© OSzone.net 2001-