Получить список процессов, таких же, как в диспетчере задач в консоли powershell. Powershell список процессов


powershell - Получить список процессов, таких же, как в диспетчере задач в консоли powershell

Во-первых, вам нужно использовать данные из одного использования Get-WMIObject (gwmi).

Когда вы выполняете несколько вызовов с использованием GWMI, вы каждый раз выполняете другой снимок данных и используете для каждого свойства другой образец. В итоге вы получите таблицу с данными о кубистской картине Пикассо... она не будет выровнять или представить весь список. Кроме того, требуется много времени для повторного захвата списка процессов, а затем захватить только одно свойство из каждого другого списка, поэтому стоит потратить время на изменение одного набора данных, особенно если вы в конечном итоге перепрограммируете свой скрипт в массивном сценарии удаленных операций, который компилирует базу данных задач.

Существуют различные способы захвата только тех свойств, которые вы хотите в виде пользовательских объектов PS. Я использую хэш-таблицы, чтобы сделать код коротким и легким, и сделать код efficient--. Вы уже выполнили вербальную запись, которую вы сделали бы для хеш-таблицы, в форме:

$CPU = $Process.CPU $WORKINGSET64 = $Process.WorkingSet64 $PEAKWORKINGSET64 = $Process.PeakWorkingSet64 $THREADS = $Process.Threads.Count $HANDLES = $Process.Handles $DESCRIPTION = $Process.Description

Поэтому вместо этого просто сделайте

$taskProps = @{ 'SID'=$task.SessionId 'Name'=$task.ProcessName 'PID'=$task.ProcessId # add more properties here. }

Вместо того, чтобы создавать пустой пользовательский объект, а затем "писать" ему несколько раз с

$obj = new-object psobject $obj | add-member noteproperty "PID" ($PIDN) $obj | add-member noteproperty "NAME" ($NAME) $obj | add-member noteproperty "OWNER" ($OWNER) $obj | add-member noteproperty "PATH" ($PATH) $obj | add-member noteproperty "Command Line" ($CMD) $obj | Add-Member noteproperty "SessionID" ($SESSIONID) $obj | Add-Member noteproperty "CPU" ($CPU) $obj | Add-Member noteproperty "WorkingSet64" ($WORKINGSET64) $obj | Add-Member noteproperty "Peak Working Set64" ($PEAKWORKINGSET64) $obj | Add-Member noteproperty "HANDLES" ($HANDLES) $obj | Add-Member noteproperty "THREADS" ($THREADS) $obj | Add-Member noteproperty "DESCRIPTION" ($DESCRIPTION)

Вы можете упаковать свойство hashtable и создать в одиночном кадре, пользовательский объект в конце:

$taskObject = New-Object -TypeName PSObject -Property $taskProps

Затем сохраните его в arraylist с

$taskList += $taskObject

Вы можете увидеть мой пример здесь:

# Generates a collection of "System.Management.ManagementObject#root\cimv2\Win32_Process" # Only do this once. Every time gwmi is used, it makes another RPC call if used remotely. # If you do multiple GWMIs you'll be working with differing data samples. $taskSnapshot = Get-WMIObject -ComputerName [machine name] -Class Win32_Process # Initialize, nullify, and declare your list as an empty ArrayList. $taskList = @() # Begin formatting in prep of Format-Table or similar usage # This is where you'd define each property you want to see, manipulation, etc. foreach ($task in $taskSnapshot){ # Create the hash table which will temporarily store all information for each task naming/assigning only # properties you want to display. $taskProps = @{ 'SID'=$task.SessionId 'Name'=$task.ProcessName 'PID'=$task.ProcessId # additional properties here. } # "Packages" the new custom object in a variable that stores the object $taskObject = New-Object -TypeName PSObject -Property $taskProps # append (addition) operation on formerly defined arraylist to store # the packaged object to an arraylist. $taskList += $taskObject } # Displays the list of task "objects" in a table, other formatting options are available online. $taskList | Format-Table -AutoSize

Использование команд форматирования для изменения вида вывода:

https://technet.microsoft.com/en-us/library/dd347677.aspx

Windows PowerShell: много способов для пользовательского объекта:

https://technet.microsoft.com/en-us/magazine/hh750381.aspx

Я также рекомендовал бы проверить Out-GridView, поскольку он создаст таблицу GUI данных, которые вы можете изменить и легко щелкнуть.

Важная часть - использовать GWMI один раз. Лучше практиковать захват необработанной информации в одной переменной, а затем выполнять операции Select-String/where/if/манипуляции и форматирования в наборе данных в вашем предложении foreach.

Вот чистая копия примера с моими избранными псевдонимами.

$taskSnapshot = gwmi -cn localhost -class win32_process $taskList = @() foreach ($task in $taskSnapshot){ $taskProps = @{ 'SID'=$task.SessionId 'Name'=$task.ProcessName 'PID'=$task.ProcessId } $taskObject = New-Object -TypeName PSObject -Property $taskProps $taskList += $taskObject } $taskList | Out-GridView

Еще одна вещь, которую кто-то упомянул, - это свойства минимального/максимального рабочего набора...

Вы можете просмотреть все свойства Win32_Process, выполнив

Get-WMIObject -Class Win32_Process | Get-Member

или

gwmi -cl win32_process | gm

qaru.site

Получить список процессов так же, как в диспетчере задач в консоли Powershell

Во-первых, вам нужно использовать данные из одного использования Get-WmiObject (Gwmi) ,

Когда вы выполняете несколько вызовов с использованием GWMI, вы каждый раз делаете другой снимок данных и используете для каждого свойства другой образец. В итоге вы получите таблицу с данными о кубистской картине Пикассо ... она не будет выровнять или представить весь список. Также требуется намного больше времени, чтобы снова и снова перехватывать список процессов, а затем захватывать только одно свойство из каждого списка, поэтому стоит потратить время на изменение одного набора данных, особенно если вы в конечном итоге перепрофилируете ваш скрипт в массивном удаленном сценарии операций, который компилирует базу данных задач.

Существуют различные способы захвата только тех свойств, которые вы хотите в виде пользовательских объектов PS.Я использую хэш-таблицы, чтобы сделать код коротким и легким, и сделать код efficient-- Вы уже выполнили verbage вы сделали бы для хэш-таблицы, в виде:

$CPU = $Process.CPU $WORKINGSET64 = $Process.WorkingSet64 $PEAKWORKINGSET64 = $Process.PeakWorkingSet64 $THREADS = $Process.Threads.Count $HANDLES = $Process.Handles $DESCRIPTION = $Process.Description

Так вместо этого, просто

$taskProps = @{ 'SID'=$task.SessionId 'Name'=$task.ProcessName 'PID'=$task.ProcessId # add more properties here. }

и вместо того, чтобы создать пустой пользовательский объект и затем «писать» на него несколько раз с

$obj = new-object psobject $obj | add-member noteproperty "PID" ($PIDN) $obj | add-member noteproperty "NAME" ($NAME) $obj | add-member noteproperty "OWNER" ($OWNER) $obj | add-member noteproperty "PATH" ($PATH) $obj | add-member noteproperty "Command Line" ($CMD) $obj | Add-Member noteproperty "SessionID" ($SESSIONID) $obj | Add-Member noteproperty "CPU" ($CPU) $obj | Add-Member noteproperty "WorkingSet64" ($WORKINGSET64) $obj | Add-Member noteproperty "Peak Working Set64" ($PEAKWORKINGSET64) $obj | Add-Member noteproperty "HANDLES" ($HANDLES) $obj | Add-Member noteproperty "THREADS" ($THREADS) $obj | Add-Member noteproperty "DESCRIPTION" ($DESCRIPTION)

Вы можете упаковать Хеш собственности и кр ЭАТС в один выстрел, пользовательский объект в конце:

$taskObject = New-Object -TypeName PSObject -Property $taskProps

Затем сохранить его в ArrayList с

$taskList += $taskObject

Вы можете увидеть мой пример здесь:

# Generates a collection of "System.Management.ManagementObject#root\cimv2\Win32_Process" # Only do this once. Every time gwmi is used, it makes another RPC call if used remotely. # If you do multiple GWMIs you'll be working with differing data samples. $taskSnapshot = Get-WMIObject -ComputerName [machine name] -Class Win32_Process # Initialize, nullify, and declare your list as an empty ArrayList. $taskList = @() # Begin formatting in prep of Format-Table or similar usage # This is where you'd define each property you want to see, manipulation, etc. foreach ($task in $taskSnapshot){ # Create the hash table which will temporarily store all information for each task naming/assigning only # properties you want to display. $taskProps = @{ 'SID'=$task.SessionId 'Name'=$task.ProcessName 'PID'=$task.ProcessId # additional properties here. } # "Packages" the new custom object in a variable that stores the object $taskObject = New-Object -TypeName PSObject -Property $taskProps # append (addition) operation on formerly defined arraylist to store # the packaged object to an arraylist. $taskList += $taskObject } # Displays the list of task "objects" in a table, other formatting options are available online. $taskList | Format-Table -AutoSize

Использование формата Команды для изменения Вид выхода:

https://technet.microsoft.com/en-us/library/dd347677.aspx

Windows PowerShell: множество способов пользовательского объекта:

https://technet.microsoft.com/en-us/magazine/hh750381.aspx

Я также рекомендовал бы проверить Out-GridView, как она будет создавать GUI таблицу данных который вы можете изменить и легко щелкнуть.

Важной частью является использование GWMI один раз. Лучше практиковать захват необработанной информации в одной переменной, а затем выполнять операции Select-String/where/if/ман

stackoverrun.com

Получение дерева процессов в PowerShell

Получение дерева процессов в PowerShell

Август 9, 2011 Автор: Kazun

Многим, думаю, знакома утилита — tree,которая отображает графическую структуру папок. По умолчанию в PowerShell нет, командлета  с таким функционалом. Но его можно найти в прекрасном модуле для PowerShell — PSCX (http://pscx.codeplex.com/) реализованном  в виде функции.

После установки и импорта данного модуля,вы можете посмотреть весь набор команд,который предлагает данный модуль:

PS > Get-Command -Module PSCX

Нам же интересна функция — Show-Tree,исходный код функции можно посмотреть с помощью:

PS > ${function:Show-Tree}

Пример работы:

PS > Show-Tree C:\windows C:\windows |--1C4551A64743409391E41477CD655043.TMP | \--WiseCustomCalla.dll |--45235788142C44BE8A4DDDE9A84492E5.TMP | \--WiseCustomCalla.dll |--8AAB4176A747493AA42CB63CFADFD8E3.TMP | \--WiseCustomCalla.dll |--ADAM | |--en | | \--ADSchemaAnalyzer.resources.dll | |--en-US | | |--adaminstall.exe.mui | | |--adammsg.dll.mui | | |--adamsync.exe.mui | | |--adamuninstall.exe.mui | | \--adamwizard.dll.mui | |--ru | | \--ADSchemaAnalyzer.resources.dll | |--ru-RU | | |--adaminstall.exe.mui | | |--adammsg.dll.mui | | |--adamsync.exe.mui | | |--adamuninstall.exe.mui | | \--adamwizard.dll.mui | |--adaminstall.exe

Более подробно об Show-Tree,вы можете прочитать в справки(набрав get-help Show-Tree -full).

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

Function Show-ProcessTree { Function Get-ProcessChildren($P,$Depth=1) { $procs | Where-Object {$_.ParentProcessId -eq $p.ProcessID -and $_.ParentProcessId -ne 0} | ForEach-Object { "{0}|--{1}" -f (" "*3*$Depth),$_.Name Get-ProcessChildren $_ (++$Depth) $Depth-- } } #Фильтр для Where-Object $filter = {-not (Get-Process -Id $_.ParentProcessId -ErrorAction SilentlyContinue) -or $_.ParentProcessId -eq 0} #Получаем список процессов $procs = Get-WmiObject Win32_Process #Получаем

kazunposh.wordpress.com

ИБ по частям: Powershell. Контролируем сетевую активность.

Приветствую, уважаемый читатель! Хотел бы сегодня поделится опытом решения следующей задачи: запрет соединения с ресурсами сети Интернет, при установлении соединения с конкретным IP-адресом. Не скажу, что данная задача является типовой и очень востребованной, но процесс её решения заставил придумывать нестандартные ходы. Будут освещены вопросы архитектуры скрипта, который сможет выполнять данную задачу, и показаны примеры работы с брандмауэром Windows из powershell. Кто заинтересовался, прошу ниже. Начнем с постановки задачи и описания последовательности действий. Предположим, что соединение с указанным IP-адресом происходит с использованием специального программного обеспечения. Задача: Контроль сетевой активности Windows-машины, с целью выявления конкретного TCP-соединения с указанным IP-адресом и блокирование всех остальных соединений. Как только соединение с конкретным адресом прекратилось, блокировка остальных соединений должна сниматься. Средство реализации задачи: Учитывая, что в последнее время мне крайне полюбился powershell, программное обеспечение решающее данную задачу будет реализовано на нём. Исходя из постановки задачи понятно, что скрипт на powershell должен выполняться в операционной системе с определённой периодичностью. Обобщённый алгоритм работы: Скрипт просматривает список всех установленных соединений в системе, с целью поиска интересующего. После нахождения такого соединения, скрипт разрывает все остальные соединения, кроме интересующего. После окончания работы с указанным IP-адресом обычная работа пользователя с ресурсами сети Интернет восстанавливается. Теперь, последовательность действий.
  1. Получение списка всех текущих TCP-соединений, с указанием приложения их создавшего, и поиск нужного соединения.
  2. Определение списка приложений, которым мы запрещаем сетевую активность и добавляем запрещающие правила брандмауера.
  3. Отмена запрещающих правил после окончания конкретного соединения.
  4. Настройка скрипта на постоянное выполнение.
Приступим к первому пункту. Получение списка всех текущих TCP-соединений, с указанием приложения их создавшего, и поиск нужного соединения. Всё просто, получаем список установленных TCP-соединений с помощью Netstat, приводим его в удобный вид и связываем по полю ProcessID со списком запущенных в операционной системе процессов. Хотел бы сделать небольшое отступление. Изначально я не планировал использовать брандмауер Windows для блокирования соединений, и собирался просто разрывать установленные соединения (ESTABLISHED) с удаленными IP-адресами. Но как оказалось, в Powershell нет командлетов или функций, которым можно сказать: Разорви конкретное соединение с этим IP-адресом. Немного погуглив, я нашел несколько решений данной проблем, но оба они использовали отдельное консольное приложение. Вот список приложений: Использование приложений: Разорвать соединение по 22 порту с IP-адресом 100.120.200.18 при помощи wkillcx   C:\scripts\wkillcx-1.0.2\wkillcx.exe 100.120.200.18:22 Разорвать соединение по 22 порту с IP-адресом 100.120.200.18 при помощи cports   C:\scripts\cports\cports.exe /close 192.168.1.30 47000 100.120.200.18 22 Варианты использования сторонних приложений мне изначально были не интересны, и я решил ограничиться только средствами powershell. Но хватит с лирикой. Код, реализующий первый пункт приведен ниже:      #Получаем список текущих TCP/UDP-соединений и список запущенных в системе процессов         $sockets_all = netstat -ano | Select-String -Pattern '\s+(TCP|UDP)' | Select-String -Pattern '\:\:' -notmatch     $process_list = Get-WmiObject -Class Win32_Process     #Создаём пустую коллекцию для списка соединений     $ProcessCollection=@()     foreach($socket in $sockets_all) {         $parse = $socket.line.split(' ',[System.StringSplitOptions]::RemoveEmptyEntries)         $ID_tcp = $parse[4]         $ID_udp = $parse[3]         $local = $parse[1] -split ":"         $remote = $parse[2] -split ":"         $local_ip = $local[0]         $local_port = $local[1]         $remote_ip = $remote[0]         $remote_port = $remote[1]         #Соединяем по ProcessID между собой список TCP-сессий и список процессов в системе         foreach($process in $process_list) {              if (($process.ProcessID -eq $ID_tcp) -and ($parse[0] -eq "TCP"))                 {                   #Данные о сессии будем хранить в PS объектах и добавлять их в коллекцию                   $obj_proc = New-Object psobject                   $obj_proc | Add-Member -type noteproperty -name Protocol -Value $parse[0]                   $obj_proc | Add-Member -type noteproperty -name LocalIP -Value $local_ip                   $obj_proc | Add-Member -type noteproperty -name LocalPort -Value $local_port                   $obj_proc | Add-Member -type noteproperty -name RemoteIP -Value $remote_ip                   $obj_proc | Add-Member -type noteproperty -name RemotePort -Value $remote_port                   $obj_proc | Add-Member -type noteproperty -name PID -Value $ID_tcp                    $obj_proc | Add-Member -type noteproperty -name ProcName -Value $process.ProcessName                   $obj_proc | Add-Member -type noteproperty -name procPath -Value $process.Path                    $obj_proc | Add-Member -type noteproperty -name CompName -Value $process.CSName                   $ProcessCollection += $obj_proc                 }     #IP-адрес, соединение с которым будет контролироваться     $ControlIP = '100.120.220.18'     #Ищем, есть ли соединение с данным адресом в текущий момент     $ResMonitor = Get-NetTcpConnection | where {$_.RemoteAddress -eq $ControlIP} Приступаем ко второму пункту. Определение списка приложений, которым мы запрещаем сетевую активность и добавляем запрещающие правила брандмауера. Вообще, управление правилами брандмауера из powershell оказалось очень удобным. Есть целая куча командлетов для управления брандмауером, приведу пару наиболее полезных: Get-NetFirewallRule (получить список правил МЭ) New-NetFirewallRule (создать новое правило МЭ) Set-NetFirewallRule (изменить правило МЭ) Remove-NetFirewallRule (удалить правило МЭ) Получить список активных исходящих правил МЭ. Get—NetFirewallRule -Direction Outbound -Enabled True Добавить новое запрещающее исходящее правило для исполняемого файла. New-NetFirewallRule -Program “C:\Temp\Test.exe” -Action Block -DisplayName “Test” -Description “Block” -Direction Outbound Отключить правило. Set-NetFirewallRule –DisplayName "Test" -Enabled False Удалить правило. Remove-NetFirewallRule -DisplayName "Test"  На основе этих базовых правил для любого МЭ, мы и реализуем блокировку. Общий алгоритм, как был описан выше: блокируем активность для всех приложений, за исключением породившего сессию с контролируемым IP-адресом. Код реализующий данную задачу приведен ниже:  #IP-адрес, соединение с которым будет котролироваться     $ControlIP = '100.120.220.18'     #Ищем, есть ли соединение с данным адресом в текущий момент     $ResMonitor = Get-NetTcpConnection | where {$_.RemoteAddress -eq $ControlIP}     #Если соединение с контролируемым IP-адресом установлено     if ($ResMonitor.count -ne 0) {         #Просматриваем все установленные соединения с IP-адресами в сети Интернет, и получаем для каждого соединения имя породившего его процесса, и путь с исполняемому файлу         foreach($proc in ($ProcessCollection | where {($_.RemoteIP -ne "0.0.0.0") -and ($_.RemoteIP -ne "127.0.0.1") -and ($_.RemoteIP -ne $ControlIP)} | select PID,ProcName,procPath -Unique)) {             $RuleCaption = "Block App - " + $proc.ProcName             #Если процесс породивший соединение уже заблокирован брандмауером Windows, то выводим сообщение             if (Get-NetFirewallRule | Where {$_.DisplayName -eq $RuleCaption}) {Write-Host "Already ban"}                 else {                         #Если процесс породивший соединение не заблокирован брандмауером Windows, то добавляем новое правило                         New-NetFirewallRule -Program $proc.procPath -Action Block -DisplayName $RuleCaption -Description “Automatical Block” -Direction Outbound                      }                 } Приступаем к третьему пункту. Отмена запрещающих правил после окончания конкретного соединения. Тут всё просто, как только соединение с контролируемым IP-адресом разорвано, то мы удаляем блокирующие правила из МЭ. Код представлен ниже: #Если соединение с контролируемым IP-адресом не установлено     elseif ($ResMonitor.count -eq 0) {         #Получаем список текущий блокирующих правил         $blockRule = Get-NetFirewallRule | Where {$_.DisplayName -like "Block App - *"}               foreach ($br in $blockRule) {                         #Удаляем блокирующее правило                         Remove-NetFirewallRule -DisplayName $br.DisplayName                } Приступаем к четвертому пункту. Настройка скрипта на постоянное выполнение. Есть несколько вариантов решения данной задачи, а именно:
  •   Добавить запуск скрипта в планировщик заданий и настройка периодичности запуска. Прочитать поподробнее про это можно тут - http://windowsnotes.ru/powershell-2/zapusk-powershell-skripta-po-raspisaniyu/
  •   Добавить в скрипте бесконечный цикл и постоянно выполнять код с использованием командлета Start-Sleep. Учитывая, что нам нужно запускать скрипт каждые 5-10 секунд, этот вариант вполне подходит
    #Запускаем скрипт в бесконечном цикле     while ($count -le 1) {             Block             Start-Sleep -Seconds 5 Таким образом, общая финальная версия скрипта приведена ниже:     #Получаем список текущих TCP/UDP-соединений и список запущенных в системе процессов         $sockets_all = netstat -ano | Select-String -Pattern '\s+(TCP|UDP)' | Select-String -Pattern '\:\:' -notmatch     $process_list = Get-WmiObject -Class Win32_Process     #Создаём пустую коллекцию для списка соединений     $ProcessCollection=@()     foreach($socket in $sockets_all) {         $parse = $socket.line.split(' ',[System.StringSplitOptions]::RemoveEmptyEntries)         $ID_tcp = $parse[4]         $ID_udp = $parse[3]         $local = $parse[1] -split ":"         $remote = $parse[2] -split ":"         $local_ip = $local[0]         $local_port = $local[1]         $remote_ip = $remote[0]         $remote_port = $remote[1]         #Соединяем по ProcessID между собой список TCP-сессий и список процессов в системе         foreach($process in $process_list) {              if (($process.ProcessID -eq $ID_tcp) -and ($parse[0] -eq "TCP"))                 {                   #Данные о сессии будем хранить в PS объектах и добавлять их в коллекцию                   $obj_proc = New-Object psobject                   $obj_proc | Add-Member -type noteproperty -name Protocol -Value $parse[0 ]                   $obj_proc | Add-Member -type noteproperty -name LocalIP -Value $local_ip                   $obj_proc | Add-Member -type noteproperty -name LocalPort -Value $local_port                   $obj_proc | Add-Member -type noteproperty -name RemoteIP -Value $remote_ip                   $obj_proc | Add-Member -type noteproperty -name RemotePort -Value $remote_port                   $obj_proc | Add-Member -type noteproperty -name PID -Value $ID_tcp                   $obj_proc | Add-Member -type noteproperty -name ProcName -Value $process.ProcessName                   $obj_proc | Add-Member -type noteproperty -name procPath -Value $process.Path                   $obj_proc | Add-Member -type noteproperty -name CompName -Value $process.CSName                   $ProcessCollection += $obj_proc                 }     #IP-адрес, соединение с которым будет котролироваться     $ControlIP = '100.120.220.18'     #Ищем, есть ли соединение с данным адресом в текущий момент     $ResMonitor = Get-NetTcpConnection | where {$_.RemoteAddress -eq $ControlIP}     #Если соединение с контролируемым IP-адресом установлено     if ($ResMonitor.count -ne 0) {         #Просматриваем все установленные соединения с IP-адресами в сети Интернет, и получаем для каждого соединения имя породившего его процееса, и путь с исполняемому файлу         foreach($proc in ($ProcessCollection | where {($_.RemoteIP -ne "0.0.0.0") -and ($_.RemoteIP -ne "127.0.0.1") -and ($_.RemoteIP -ne $ControlIP)} | select PID,ProcName,procPath -Unique)) {             $RuleCaption = "Block App - " + $proc.ProcName             #Если процесс породивший соединение уже заблокирован брандмауером Windows, то выводим сообщение             if (Get-NetFirewallRule | Where {$_.DisplayName -eq $RuleCaption}) {Write-Host "Already ban"}                 else {                         #Если процесс породивший соединение не заблокирован брандмауером Windows, то добавляем новое правило                         New-NetFirewallRule -Program $proc.procPath -Action Block -DisplayName $RuleCaption -Description “Automatical Block” -Direction Outbound                      }                 }     #Если соединение с контролируемым IP-адресом не установлено     elseif ($ResMonitor.count -eq 0) {         #Получаем список текущий блокирующих правил         $blockRule = Get-NetFirewallRule | Where {$_.DisplayName -like "Block App - *"}             foreach ($br in $blockRule) {                 #Удаляем блокирующее правило                 Remove-NetFirewallRule -DisplayName $br.DisplayName     #Запускаем скрипт в бесконечном цикле     while ($count -le 1) {         Start-Sleep -Seconds 5 Результат работы скрипта в настройка брандмауэра приведены на скриншоте: Предвижу, что может появиться закономерный вопрос: Что делать если контролируемое соединение породило не отдельное приложение, а, например, браузер Chrome? Для данной ситуации код скрипта необходимо доработать, и блокирующие правила в МЭ должны добавляться на основании внешних IP-адресов в соединении, а не по приложениям. Делается это не трудно, позднее напишу.  

На этом пока всё, может кому пригодится.

unitybas.blogspot.com

powershell - Проверка состояния процесса и процесса в PowerShell версии 2 и получение двух разных выходов в зависимости от одного процесса или нескольких процессов?

Вот код, который я использую:

$ProcessesToCheckFor = ( 'company_name_uat-Historian' ) $FoundProcesses = Get-Process -Name $ProcessesToCheckFor -ErrorAction SilentlyContinue foreach ($Item in $ProcessesToCheckFor) { if ($FoundProcesses.Name -contains $Item) { '{0} runn1ng' -f $Item } else { '{0} fai1ed' -f $Item } }

Код проверяет, работает ли процесс company_name_uat-Historian на сервере, и если он запущен, он выведет runn1ng и fai1ed, если нет.

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

Мне нужно проверить список процессов, поэтому, когда я связываю остальные, как указано ниже:

$ProcessesToCheckFor = ( 'company_name_uat-Historian', 'company_name_uat-KEReviewCollector', 'company_name_uat-lwm', 'company_name_uat-MQAck', 'company_name_uat-MQOutput', 'company_name_uat-SQAC', 'company_name_uat-Store', 'company_name_uat-Store_STS', 'company_name_uat-StoreLegacy', 'spotify' ) $FoundProcesses = Get-Process -Name $ProcessesToCheckFor -ErrorAction SilentlyContinue foreach ($Item in $ProcessesToCheckFor) { if ($FoundProcesses.Name -contains $Item) { '{0} runn1ng' -f $Item } else { '{0} fai1ed' -f $Item }

Все они выводят fai1ed.

Если я делаю их один за другим, каждый другой процесс вернет runn1ng, а все сгруппированные вместе возвратятся fai1ed.

Боковые заметки (если кому интересно):

  • runn1ng и fai1ed являются "кодовыми словами", которые заменяются изображениями с использованием JavaScript. Я делаю панель управления HTML, которая контролирует мои серверы Windows для работы, поэтому используйте зеленые галочки и красные значки x, а что нет.
  • Использование версии PowerShell 2 не является моим выбором, некоторые из серверов, на которых я отвечаю за мониторинг, - это Windows 2008 R2. Я считаю, что они будут обновляться в этом году, но для выполнения проекта мне необходимо немедленно принять решение о мониторинге. Есть также некоторые серверы, которые в 2012 году я люблю писать сценарии PowerShell для.
  • spotify указан как процесс, потому что я знаю, что это законный процесс, но не установлен на наших серверах. Когда я писал script, я сначала тестировал свою личную машину и использовал spotify как средство для тестирования runn1ng, если я открыл его или fai1ed, если бы я его закрыл. Если все мои процессы runn1ng, а spotify - fai1ed, то это указывает на то, что код PS работает.

Это похоже на версию PowerShell версии 2.

Любые идеи, что вызывает его и как я могу его переписать?

qaru.site

Общие сведения о рабочем процессе Windows PowerShell

  • 06/20/2016
  • Время чтения: 5 мин

В этой статье

 

Применимо к:Windows Server 2012, Windows Server 2012 R2

ИТ-специалисты и разработчики часто автоматизируют управление своими системами из нескольких компьютеров, используя последовательности длительно выполняемых задач или рабочих процессов, которые могут воздействовать на множество управляемых компьютеров или устройств одновременно. Рабочий процесс Windows PowerShell дает возможность ИТ-специалистам и разработчикам воспользоваться преимуществами Windows Workflow Foundation с функциями автоматизации Windows PowerShell. Функциональные возможности рабочего процесса Windows PowerShell были представлены в Windows Server® 2012 и Windows 8 и входят в состав Windows PowerShell 3.0 и более поздних выпусков Windows PowerShell. Рабочий процесс Windows PowerShell помогает автоматизировать распределение, управление и выполнение задач на нескольких компьютерах, что освобождает пользователей и администраторов для работы над задачами более высокого уровня.

Windows PowerShell, впервые появившаяся в Windows Vista и Windows Server 2008, объединяет распределенный механизм автоматизации, оболочку командной строки и язык сценариев на платформе Microsoft® .NET Framework. Она предназначена специально для автоматизации управления Windows.

Рабочий процесс Windows PowerShell — это ключевой компонент Windows PowerShell 3.0 и Windows PowerShell 4.0. Дополнительные сведения о Windows PowerShell см. в разделе Новые возможности Windows PowerShell.

Содержание:

  • Обзор рабочего процесса Windows PowerShell

  • Отличия между сценариями Windows PowerShell и рабочими процессами Windows PowerShell

  • Создание и импорт рабочих процессов с помощью конструктора рабочих процессов Visual Studio

Обзор рабочего процесса Windows PowerShell

Рабочий процесс — это последовательность связанных программируемых операций, в ходе которых выполняются длительные задачи или скоординированные действия на нескольких устройствах или управляемых узлах. Рабочий процесс Windows PowerShell позволяет ИТ-специалистам и разработчикам создавать в качестве рабочих процессов последовательности действий управления несколькими устройствами или отдельные задачи в рамках рабочего процесса. Рабочие процессы могут быть длительными, повторяющимися, часто используемыми, параллельными, прерываемыми, останавливаемыми и перезапускаемыми. Их можно приостанавливать и возобновлять. Они также могут продолжаться после непредвиденных сбоев, например сбоя сети или перезагрузки компьютера.

Рабочие процессы Windows PowerShell можно создать или определить с использованием синтаксиса Windows PowerShell или XAML-файлов. Дополнительные сведения о создании рабочего процесса Windows PowerShell на основе сценария см. в разделе Создание рабочего процесса сценария. Дополнительные сведения о рабочих процессах на основе XAML см. в разделе Создание и импорт рабочих процессов с помощью конструктора рабочих процессов Visual Studio далее.

Благодаря функции RunAs в Windows PowerShell настраиваемые конфигурации сеансов позволяют ИТ-специалистам запускать рабочие процессы или действия внутри рабочего процесса с делегированными или подчиненными правами.

Действия

Действие — это конкретная задача, которую должен выполнить рабочий процесс. Так же, как сценарий состоит из одной или нескольких команд, рабочий процесс состоит из одного или нескольких действий, выполняемых в определенной последовательности. Сценарий можно также использовать как одну команду в другом сценарии, а рабочий процесс можно использовать как действие в другом рабочем процессе.

Преимущества рабочего процесса Windows PowerShell

В представленном ниже списке перечислены преимущества рабочего процесса Windows PowerShell.

  • Использование синтаксиса сценариевWindows PowerShell

    ИТ-специалисты могут использовать навыки написания сценариев Windows PowerShell для создания процессов на основе сценариев с использованием расширяемого языка Windows PowerShell. Рабочие процессы на основе сценария Windows PowerShell легки в написании и могут совместно использоваться путем их вставки в сообщение электронной почты или публикации на веб-страницах.

  • Управление несколькими устройствами

    Задачи рабочего процесса можно применить одновременно для сотен управляемых узлов. Рабочий процесс Windows PowerShell автоматически добавляет общие параметры в рабочие процессы, такие как PSComputerName, чтобы разрешить использование сценариев управления несколькими устройствами. Дополнительные сведения о параметрах, которые зарезервированы для рабочих процессов, см. в разделе "Зарезервированные слова в рабочих процессах" в Справочные разделы по созданию рабочего процесса.

  • Выполнение одной задачи для управления сложными комплексными процессами

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

  • Автоматическое восстановление после сбоя

    Рабочий процесс подвергается как запланированным, так и незапланированным прерываниям, таким как перезагрузки компьютеров. Выполнение рабочего процесса можно приостановить, а затем перезапустить или возобновить процесс с точки, в которой он был приостановлен. В ходе рабочего процесса можно создавать контрольные точки, чтобы возобновлять рабочий процесс с последней сохраненной задачи (или контрольной точки), а не перезапускать рабочий процесс сначала.

  • Повторные попытки подключения и выполнения действий

    С помощью общих параметров рабочих процессов пользователи могут повторять подключения к управляемым узлам в случае сбоя сетевого подключения. Разработчики рабочих процессов также могут указывать действия, которые необходимо выполнить снова, если действие не может быть завершено на одном или нескольких управляемых узлах (например, если целевой компьютер находился в автономном режиме во время выполнения действия).

  • Подключение и отключение

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

  • Расписание задач

    Задачи рабочего процесса, как и любой другой командлет или сценарий Windows PowerShell, могут быть запланированы и выполнены при выполнении заданных условий.

Отличия между сценариями Windows PowerShell и рабочими процессами Windows PowerShell

В сценарии все команды выполняются в одном пространстве выполнения, при этом операционная среда определяет, какие команды, переменные и другие элементы доступны. В рабочем процессе каждое действие можно запускать в разных пространствах выполнения. Переменные, созданные на верхнем уровне рабочего процесса, доступны для всего рабочего процесса. Если они создаются на уровне сценария или команды, они доступны для команды или сценария, но не для всего рабочего процесса.

В общем случае следует использовать рабочий процесс вместо командлета или сценария, если необходимо выполнить одно из следующих требований.

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

  • Необходимо выполнить задачу, которая выполняется на нескольких устройствах.

  • Необходимо выполнить задачу, для которой требуются контрольные точки или сохраняемость.

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

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

Создание и импорт рабочих процессов с помощью конструктора рабочих процессов Visual Studio

Помимо создания рабочих процессов, использующих сценарии Windows PowerShell, их также можно создавать в конструкторе рабочих процессов Visual Studio. Рабочие процессы, создаваемые в конструкторе рабочих процессов Visual Studio, имеют расширение имени файла XAML. Рабочие процессы, созданные в конструкторе рабочих процессов, можно вызывать и импортировать в рабочие процессы Windows PowerShell. Вы можете предоставлять командлеты Windows PowerShell в качестве действий в конструкторе рабочих процессов.

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

Действия рабочих процессов Windows PowerShell в конструкторе рабочих процессов Visual Studio

Windows PowerShell включает встроенные действия для большинства командлетов Windows PowerShell. Эти действия упакованы в сборки, имена которых соответствуют имени модуля Windows PowerShell, содержащего командлеты. Ниже приведен список сборок действий Windows PowerShell, установленных в глобальном кэше сборок.

  • Microsoft.PowerShell.Activities

  • Microsoft.PowerShell.Core.Activities

  • Microsoft.PowerShell.Diagnostics.Activities

  • Microsoft.PowerShell.Management.Activities

  • Microsoft.PowerShell.Security.Activities

  • Microsoft.PowerShell.Utility.Activities

  • Microsoft.WSMan.Management.Activities

Дополнительные сведения о добавлении действия на панель элементов из сборки см. в статье Как добавить действия в область элементов.

См. также

Настройка среды рабочего процессаВыполнение рабочего процесса Windows PowerShellСоздание рабочего процесса сценарияНовые возможности Windows Workflow Foundation 4.0about_Jobsabout_Workflow_Common_Parametersabout_Workflows

technet.microsoft.com

Управление процессами с помощью командлетов процессов

Командлеты с существительным Process можно использовать в Windows PowerShell для управления локальными и удаленными процессами.

Для получения списка процессов локального компьютера запустите командлет Get-Process без параметров.

Для получения конкретных процессов можно указывать имена или ИД этих процессов. Следующая команда возвращает процесс Idle.

PS> Get-Process -id 0 Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 0 0 0 16 0 0 Idle

Несмотря на то что для командлетов является обычным не возвращать данные в некоторых ситуациях, при задании процесса через ProcessId командлет Get-Process возвращает ошибку при отсутствии совпадений, потому что предполагается получение известного выполняемого процесса. Если процесс с указанным идентификатором не найден, вполне вероятно, что идентификатор задан неверно или искомый процесс был завершен.

PS> Get-Process -Id 99 Get-Process : No process with process ID 99 was found. At line:1 char:12 + Get-Process <<<< -Id 99

Параметр Name командлета Get-Process позволяет задать подмножество процессов по имени процесса. Параметр Name поддерживает использование нескольких имен, разделенных запятой, и подстановочных знаков, позволяя вводить шаблоны имен:

Например, следующая команда возвращает все процессы с именем, начинающимся с "ex".

PS> Get-Process -Name ex* Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 234 7 5572 12484 134 2.98 1684 EXCEL 555 15 34500 12384 134 105.25 728 explorer

Поскольку класс .NET System.Diagnostics.Process лежит в основе процессов Windows PowerShell, он следует соглашениям, которые используются процессом System.Diagnostics.Process. Одно из этих соглашений заключается в том, что имя процесса исполняемого файла никогда не включает расширение ".exe" в конце имени исполняемого файла.

Командлет Get-Process позволяет указывать несколько значений параметра Name.

PS> Get-Process -Name exp*,power* Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 540 15 35172 48148 141 88.44 408 explorer 605 9 30668 29800 155 7.11 3052 powershell

Параметр ComputerName командлета Get-Process можно использовать для получения процессов с удаленных компьютеров. Например, следующая команда позволяет получить процессы PowerShell с локального компьютера ("localhost") и двух удаленных компьютеров.

PS> Get-Process -Name PowerShell -ComputerName localhost, Server01, Server02 Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 258 8 29772 38636 130 3700 powershell 398 24 75988 76800 572 5816 powershell 605 9 30668 29800 155 7.11 3052 powershell

Здесь имена компьютеров неочевидны, но хранятся в свойстве MachineName объектов процессов, выводимых Get-Process. В следующем примере командлет Format-Table используется для вывода свойств process ID, ProcessName и MachineName (ComputerName) объектов процессов.

PS> Get-Process -Name PowerShell -ComputerName localhost, Server01, Server01 | Format-Table -Property ID, ProcessName, MachineName Id ProcessName MachineName -- ----------- ----------- 3700 powershell Server01 3052 powershell Server02 5816 powershell localhost

Эта более сложная команда добавляет свойство MachineName в стандартный вывод Get-Process. Символ (`)(ASCII 96) в Windows PowerShell является знаком продолжения строки.

get-process powershell -computername localhost, Server01, Server02 | format-table -property Handles, ` @{Label="NPM(K)";Expression={[int]($_.NPM/1024)}}, ` @{Label="PM(K)";Expression={[int]($_.PM/1024)}}, ` @{Label="WS(K)";Expression={[int]($_.WS/1024)}}, ` @{Label="VM(M)";Expression={[int]($_.VM/1MB)}}, ` @{Label="CPU(s)";Expression={if ($_.CPU -ne $()` {$_.CPU.ToString("N")}}}, ` Id, ProcessName, MachineName -auto Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName MachineName ------- ------ ----- ----- ----- ------ -- ----------- ----------- 258 8 29772 38636 130 3700 powershell Server01 398 24 75988 76800 572 5816 powershell localhost 605 9 30668 29800 155 7.11 3052 powershell Server02

Оболочка Windows PowerShell предоставляет различные способы получить список процессов. Каким же образом процессы можно останавливать?

Командлету Stop-Process передается имя (свойство Name) или идентификатор (Id), определяющие процесс, который требуется остановить. Возможность остановки процесса зависит от имеющихся у пользователя разрешений. Некоторые процессы не могут быть остановлены. Например, при попытке остановить процесс бездействия системы, будет получена ошибка:

PS> Stop-Process -Name Idle Stop-Process : Process 'Idle (0)' cannot be stopped due to the following error: Access is denied At line:1 char:13 + Stop-Process <<<< -Name Idle

С помощью параметра Confirm можно установить запрос подтверждения. Этот параметр особенно полезен в тех случаях, когда при указании имени процесса используется подстановочный знак: пользователь может случайно остановить некоторые процессы с похожим именем, которые останавливать не надо.

PS> Stop-Process -Name t*,e* -Confirm Confirm Are you sure you want to perform this action? Performing operation "Stop-Process" on Target "explorer (408)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):n Confirm Are you sure you want to perform this action? Performing operation "Stop-Process" on Target "taskmgr (4072)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):n

Сложные действия с процессами выполняются с помощью нескольких командлетов фильтрации объектов. У объекта Process имеется свойство Responding, принимающее значение "TRUE", если объект не реагирует на запросы. Все неотвечающие приложения можно остановить следующей командой:

Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process

Тот же подход можно использовать и в других ситуациях. Допустим, приложение вспомогательной области уведомления автоматически вызывается, когда пользователь запускает другое приложение. В сеансах службы терминалов это работает неверно, но требуется, чтобы работа сеансов продолжалась на физической консоли компьютера. Сеансы, подключенные к физическому настольному компьютеру, всегда определяются идентификатором сеанса 0, поэтому все экземпляры процесса, принадлежащие другим сеансам, можно остановить с помощью командлета Where-Object и процесса SessionId:

Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process

В командлете Stop-Process не предусмотрен параметр ComputerName. Поэтому для остановки службы на удаленном компьютере следует использовать командлет Invoke-Command. Например, для остановки процесса PowerShell на удаленном компьютере Server01 введите:

Invoke-Command -ComputerName Server01 {Stop-Process Powershell}

Иногда становится необходимым остановить все запущенные сеансы Windows PowerShell, кроме текущего. Если в сеансе используется слишком много ресурсов или он недоступен (выполняется удаленно или в другом сеансе рабочего стола), то остановить его напрямую невозможно. Однако при попытке остановить все выполняемые сеансы текущий сеанс может быть просто завершен.

У каждого сеанса Windows PowerShell имеется переменная среды, PID, в которой содержится идентификатор процесса Windows PowerShell. Переменную $PID можно сверять с идентификаторами каждого сеанса и останавливать только сеансы Windows PowerShell с другим ИД. Приведенная ниже команда конвейера выполняет эту задачу и выводит список остановленных сеансов (поскольку используется параметр PassThru):

PS> Get-Process -Name powershell | Where-Object -FilterScript {$_.Id -ne $PID} | Stop-Process - PassThru Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 334 9 23348 29136 143 1.03 388 powershell 304 9 23152 29040 143 1.03 632 powershell 302 9 20916 26804 143 1.03 1116 powershell 335 9 25656 31412 143 1.09 3452 powershell 303 9 23156 29044 143 1.05 3608 powershell 287 9 21044 26928 143 1.02 3672 powershell

В комплект Windows PowerShell также входят командлеты для запуска (перезапуска) процессов, отладки процессов и ожидания выполнения процессов перед запуском команды. Информацию об этих командлетах можно получить в разделах справки о конкретных командлетах.

winintro.ru