Компьютерный форум 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=193204)

Weterok 06-12-2010 18:45 1559709

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

tarasov.evgeny 07-12-2010 12:05 1560161

Добрый день,

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

$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 1560636

Цитата:

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

...
(Get-WmiObject -Class Win32_Process -ComputerName $PCName | Where-Object -FilterScript{$_.Name -like "$ProcessName"}).Terminate()
...


snark 11-05-2011 14:37 1674301

Если вместо "завершить процесс" нужно выбрать "завершить дерево процессов" - то каким образом нужно изменить скрипт?

Butunin Klim 01-06-2011 15:49 1686474

А как сделать поиск по всем компьютерам в определенной орг еденице?!
(Что бы убить процесс на всех машинах домене кроме серверов?! )

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

Kazun 01-06-2011 17:42 1686546

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 1687042

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

Weterok 03-06-2011 12:09 1687674

Всем привет.
Если кому нужно - вот рабочий скрипт, который и был решением вопроса, по поиску процесса "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 1689483

Не понятно разьесните...

$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 1689501

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

Butunin Klim 08-06-2011 14:36 1690682

Цитата:

Цитата Kazun
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 1690725

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

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

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

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

Butunin Klim 08-06-2011 15:36 1690735

Тоесть -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 1690754

Решил - проблема с машиной

Kazun 08-06-2011 16:15 1690782

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

Butunin Klim 08-06-2011 16:26 1690794

Ага, здорово.
Я понимаю я надоел уже небось , но так как я лох в пс можно мне прям код бросить... :) полный

Kazun 08-06-2011 17:09 1690831

По пунктам опишите,что и откуда брать и какой вид конечного файла,хотелось бы видеть.

Butunin Klim 08-06-2011 22:21 1691088

Есть домен STORE.LOCAL
На машинах запускается програма которая иногда виснет (причем на всех одновременно, долго расказывать проблемы с корявостью сиквел баз).

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

Kazun 08-06-2011 23:00 1691113

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

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

Butunin Klim 09-06-2011 13:54 1691407

Это хороший скрипт. Но у нас более 1000 машин. И запуск такого поиска это займет более часа. А машин около 50 на которых это надо запустить...
Закинуть машины в новую OU не получиться так как есть специфические политики ...

SahatoshL 10-12-2015 11:49 2583349

подскажите пожалуйста как можно пробежаться по списку компов в тхт и вывести список компов на которых запущен определенные процесс? повершел не разу не учил, сегодня появилась задачка почитал понял что повершел для этого идеально подходит но пока что то не могу понять как это сделать? заранее благодарен!

SahatoshL 10-12-2015 12:29 2583357

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

Remove-Item C:\1\powershell\result.txt
$proc = "AcsClient.exe"
gwmi "Win32_Process" -filter "Name='$proc'" -ComputerName (gc comps.txt) | %{"Comps:$_" >>result.txt ; }

SahatoshL 11-12-2015 12:48 2583735

возник другой вопрос все по тому же списку. а как указать какие параметры выводить в файлик?

Iska 14-12-2015 11:59 2584668

Цитата:

Цитата SahatoshL
возник другой вопрос все по тому же списку. а как указать какие параметры выводить в файлик? »

Get-WmiObject, свойство:
Цитата:

-Property<String[]>

Gets the specified WMI class properties. Enter the property names.


Время: 05:04.

Время: 05:04.
© OSzone.net 2001-