PDA

Просмотр полной версии : Batch файл, прибивающий процесс


$moker
11.04.2005, 18:18
Необходимо по имени процесса прибивать приложение. Есть список "хороших" процессов, с которыми сравниваются каждый из запущенных процессов на удаленной машине и в случае ее отсутствия прибить процесс.

Вот как я думаю.

с помощью pslist я могу создать текстовый файл типа

Name Pid Pri Thd Hnd Priv CPU Time Elapsed Time
Idle 0 0 2 0 0 10:10:18.812 5:11:32.823
System 8 8 47 147 24 0:00:20.984 5:11:32.823

ну и тд. отсюда нужно попробовать достать имя процесса, сравнить с правильным (другой файл содежит имена всех "правильных" процессов) и с помощью pskill прибить в случае несовпадения.

загвоздка в физической реализации :)))

Premium
11.04.2005, 20:30
А не легче создать список нежелательных процессов, типа в столбик kill.txt

icq
soliter
и тд

И периодически запускать

@echo off
for /f %%a in (kill.txt) do pskill %%a>>log.txt

Нет такого процесса и фиг с ним, есть - pskill его прибьет. Синтаксис pskill.exe для удаленной машины, извини, не помню (не пользуюсь им), вроде там что-то
pskill имя_компа юзер пароль имя_процесса
То, что ты хочешь, тоже можно, только писанины в батнике побольше и гарантии поменьше, что легальный процесс не прибьешь.

$moker
12.04.2005, 09:42
Вобщето этот батник задумывался, как мера против игрушек на работе, а так как почти у каждого есть доступ в инет, где немеряное кол-во игр, то создать список нежелательных процессов весьма проблематично (одним солитером дело не обойдется ) ;) С разрешенными все гораздо проще.

Premium
12.04.2005, 20:40
Сетки у меня все равно нет сейчас ни дома, ни на работе, проверять негде, я на примере локального компа покажу, подправишь там параметры комстроки сам.
Мысль должна идти :) в таком направлении:
Выдернуть из того, что выдает pslist.exe, имена процессов. Я ее сейчас скачал, она в начале пишет копирайты, номер своей версии и тп, всего 8 ненужных строчек, их пропускаем (skip=8). Из каждой оставшейся строчки необходимо только первое слово(имя процесса), значит делаем tokens=1. Итого получается

@echo off
for /f "skip=8 tokens=1" %%a in ('pslist') do echo %%a>>somename.txt

Оно?

Ну в текстовой файл список процессов писать не надо, имя каждого найденного процесса(%%a) отдаем команде find, пусть find ищет его в списке разрешенных (D:\allow.txt), сделай его предварительно.

System
winlogon
services
lsass
svchost
и тд

А потом в батнике есть такая штука, как две палки || (два символа канала :) ), если после них написать команду, то она выполнится, только если предыдущая команда завершилась с ошибкой(в твоем случае find не нашла процесс в списке разрешенных. То есть получается

@echo off

for /f "skip=8 tokens=1" %%a in ('pslist') do (
find /i "%%a" D:\allow.txt || echo %%a - net ego v allow.txt>>D:\mustkill.txt
)

Вместо записи в mustkill.txt в реале естественно убивать процесс при помощи pskill.exe.
Как запустить получившийся *.cmd на всех машинах в сетке знаешь?

Копирование по сети на все машины сразу
http://www.kv.by/index2004171106.htm
приблизительно таким же макаром.

:: Конец мысли
:еоф

$moker
13.04.2005, 09:59
Спасибо! Я пошел другим путем,через дополнительную переменную. Ниже это не часть программы, а проверка работоспособности необходимой мне функции, а именно: не пойму где ошибка. В теле цикла по идее переменная Z должна менять значение. в текстовом файле, содержащем все переменные она поменяла, а каталог все равно создется lsas

@echo off
set v=CMD
set z=lsas
for /f %%j in (right.txt) do (
if %%j == %v% (
set z=%%j
set >c:\1212\11.txt
md c:\1212\%z%
)
)

В чем ошибка?

Ниже приведу сам текст программы, который тоже благополучно не работает :(

@echo off

set v=b
for /f "tokens=1,2* delims= " %%i in (15.txt) do (
if not %v% == a (pskill %z%>log.txt) else (
for /f %%j in (right.txt) do (
if %%j == %%i (set v=a) else (
set z=%%i
)
)
)
)

:idontnow:

Ghost
13.04.2005, 10:00
$moker
cmd.exe должен быть запущен с параметром "/V:ON"/V:ON Разрешение отложенного расширения переменных среды с применением
символа '!' в качестве разделителя. Например, /V:ON разрешает
использовать !var! в качестве расширения переменной var во время
выполнения. Синтаксис var служит для расширения переменных
при вводе, что приводит к совсем другим результатам внутри
цикла FOR.

$moker
13.04.2005, 10:50
А если у меня бат файл...я делаю НЕ через командную строку :confused:

Ghost
13.04.2005, 10:59
$moker
А что по-твоему запускает твой батник? А.С. Пушкин? Попробуй запустить его так:cmd /v:on /c batnik.batЗ.Ы. Не забудь о том, что теперь вместо %var% нужно использовать !var!.

З.З.Ы. Только что проверил вот на таком простеньком примере (файл 1.cmd) - все работает (запускал так: cmd /v:on /c 1.cmd):@echo off
set v=a
echo !v!
for /l %%i in (1,1,5) do set v=!v!b
echo !v!