Войти

Показать полную графическую версию : Найти процесс на пк в домене и убить его


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

Weterok
06-12-2010, 18:45
Нужно найти определенный процесс на компьютерах в домене, и убить его.

tarasov.evgeny
07-12-2010, 12:05
Добрый день,

Вот моё решение:

$PCName = "TestPC"
$ProcessName = "skype.exe"
IF (Test-connection -Quiet -Delay 1 -Count 2'
-ErrorAction SilentlyContinue -ComputerName $PCName)
{$a = Get-WmiObject -Class Win32_Process'
-ComputerName $PCName
| Where-Object -FilterScript{$_.Name -like "$ProcessName"}
($a).Terminate()
"Процесс убит!!!" }
Else {"Компьютер $1 выключен"}

Вопрос. можно убить процесс "в одну строку". Т.е. я сначала процесс помещаю в переменную, а затем её убиваю.
Можно ли сделать это без помещения процесса в переменную?

Не думаю, что стоит удалять пост. На мой взгляд данный форум силен в помощи. Он существует для того, чтобы помогать людям решать практические задачи.

Radchin
08-12-2010, 00:18
Вопрос. можно убить процесс "в одну строку". Т.е. я сначала процесс помещаю в переменную, а затем её убиваю. Можно ли сделать это без помещения процесса в переменную?

Да, конечно же можно. И круглые скобки Вам в этом должны помочь за вполне умеренную цену. Итак
...
(Get-WmiObject -Class Win32_Process -ComputerName $PCName | Where-Object -FilterScript{$_.Name -like "$ProcessName"}).Terminate()
...

snark
11-05-2011, 14:37
Если вместо "завершить процесс" нужно выбрать "завершить дерево процессов" - то каким образом нужно изменить скрипт?

Butunin Klim
01-06-2011, 15:49
А как сделать поиск по всем компьютерам в определенной орг еденице?!
(Что бы убить процесс на всех машинах домене кроме серверов?! )

или из тектового файла (я могу сделать текс фаил с именами компьютеров) например comps.txt

Kazun
01-06-2011, 17:42
1) Для поиска в AD.
$ou = [ADSI]"LDAP://CN=Computers,DC=contoso,DC=com"
$proc = "calc.exe"

foreach ($child in $ou.children | ? {$_.objectCategory -match "Computer" -and $_.operatingSystem -notmatch "Server"})
{
$child | ? {Test-Connection $_.dNSHostName -Count 1 -Quiet } | % {
gwmi "Win32_Process" -filter "Name='$proc'" -ComputerName $_.dNSHostName | %{$_.Terminate()}
}
}

2) Если из файла .
gwmi "Win32_Process" -filter "Name='$proc'" -ComputerName (gc computers.txt) | %{$_.Terminate()}

GODLATRO
02-06-2011, 13:16
Не надо такие темы закрывать и тем более удалять. Чтобы другие люди потом находили решение вопросов здесь.

Weterok
03-06-2011, 12:09
Всем привет.
Если кому нужно - вот рабочий скрипт, который и был решением вопроса, по поиску процесса "cmd.exe" на всех компьютерах в домене и убиванию его.
$proc = "cmd.exe"
$strCategory = "computer"
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.Filter = ("(objectCategory=$strCategory)")
$colProplist = "name"
foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}
$colResults = $objSearcher.FindAll()
foreach ($objResult in $colResults)
{
$objComputer = $objResult.Properties
$objComputer.name
if (Test-Connection -Count 2 -ComputerName $objComputer.name -Quiet)
{
$ps = Get-WmiObject Win32_Process -Filter "Name='$proc'" -ComputerName $objComputer.name

foreach ($i in $ps)
{
$result = $i.Terminate()
if ($result.ReturnValue -eq 0) { "Success $comp"}
else {"Error $comp"}
}
}
}

Butunin Klim
06-06-2011, 18:30
Не понятно разьесните...

$cred = get-credential
$ou = [ADSI]"LDAP://CN=Computers,DC=store,DC=eom,DC=broom"
$proc = "cmd.exe"

foreach ($child in $ou.children | ? {$_.objectCategory -match "Computer" -and $_.operatingSystem -notmatch "Server"})
{
$child | ? {Test-Connection $_.dNSHostName -Count 1 -Quiet } | % {
gwmi "Win32_Process" -filter "Name='$proc'" -ComputerName (gc comps.txt) | %{$_.Terminate()}
}
}

с скриптом лежит фаил comps.txt
при запуске
Get-WmiObject : Сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA)
строка:9 знак:7
+ gwmi <<<< "Win32_Process" -filter "Name='$proc'" -ComputerName (gc comps.txt) | %{$_.Terminate()}
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject], COMException
+ FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

И процесс в цикле ... а мне бы хотелось что бы цикла не было ... запустил один раз и один раз скрипт закрыл процесс.

Если есть возможно после открытие его с указанного пути ... путь \\TT\search\cmd.exe

Weterok, а можно тоже самое только что бы имена компьютеров брал из файла comps.txt

Kazun
06-06-2011, 19:01
Достаточно только этой строки в скрипте.Вы уж определитесь откуда имена компьютеров будут браться и для файла comps.txt(для тестов укажите полный путь).
gwmi "Win32_Process" -filter "Name='$proc'" -ComputerName (gc comps.txt) | %{$_.Terminate()}

Butunin Klim
08-06-2011, 14:36
gwmi "Win32_Process" -filter "Name='$proc'" -ComputerName (gc comps.txt) | %{$_.Terminate()} »

Спасибо.
Я понял.

И важно вот еще что.
Домена два.
И по этому если администратор выполнит скрипт из под своей учетной записи машины из второго домена не закроют процесс.
Приходить запускать потом скрипт из под runas
можно ли в тело скрипта внедрить запрос авторизации после выполнение скрипта и повторный прогон уже из под учетки дргого домена?
ЧТо то на подобии


$proc = "cmd.exe"
gwmi "Win32_Process" -filter "Name='$proc'" -ComputerName (gc c:\comps.txt) | %{$_.Terminate()}
$cred = get-credential 2domen\User
gwmi "Win32_Process" -filter "Name='$proc'" -ComputerName (gc c:\comps.txt) | %{$_.Terminate()}


А как на счет открытия нового процесса из под пользователя который в данный момет сидит?

Kazun
08-06-2011, 15:24
Для этого есть параметр -Credential и не надо никаких двух процессов. В данном случае достаточно отловить ошибку,т.к будет Acess Denied и уже повторно запустить скрипт,но с указанием credentials.

Попробовать использовать: runas,psexec,schtasks на удаленном компьютере с передачей реквизитов залогиненного пользователя.

Данные команды можно запустить с помощью WMI метода Create - http://msdn.microsoft.com/en-us/library/aa389388(v=vs.85).aspx

Хотя у большинства команд есть поддержка удаленного компьютера.

Butunin Klim
08-06-2011, 15:36
Тоесть -Credential надо поставить первой строчкой?!

Ошибка вылетает следующая
Get-WmiObject : Сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA)
строка:3 знак:5
+ gwmi <<<< "Win32_Process" -filter "Name='$proc'" -ComputerName (gc c:\comps.txt) | %{
$_.Terminate()}
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject], COMException
+ FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiOb
jectCommand
Фаер вола нет.
Машина отвечает на запросы

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

Butunin Klim
08-06-2011, 15:54
Решил - проблема с машиной

Kazun
08-06-2011, 16:15
В блоке foreach добавить скажем для примера: % { "Comps:$_" >>result.txt ; $_.Terminate()}

Butunin Klim
08-06-2011, 16:26
Ага, здорово.
Я понимаю я надоел уже небось , но так как я лох в пс можно мне прям код бросить... :) полный

Kazun
08-06-2011, 17:09
По пунктам опишите,что и откуда брать и какой вид конечного файла,хотелось бы видеть.

Butunin Klim
08-06-2011, 22:21
Есть домен STORE.LOCAL
На машинах запускается програма которая иногда виснет (причем на всех одновременно, долго расказывать проблемы с корявостью сиквел баз).

Задача все автоматизировать
1. Найти все машины с процесом search.exe занести в фаил
2. С помощью вашего скрипта закрыть это процес.

Kazun
08-06-2011, 23:00
Скрипт полностью удовлетворяющий всем условиям уже есть в теме - http://forum.oszone.net/post-1687674-8.html .

Остается только запустить на машине входящей в домен.

Butunin Klim
09-06-2011, 13:54
Это хороший скрипт. Но у нас более 1000 машин. И запуск такого поиска это займет более часа. А машин около 50 на которых это надо запустить...
Закинуть машины в новую OU не получиться так как есть специфические политики ...




© OSzone.net 2001-2012