Несколько полезных командлетов PowerShell

Clear-Host - очистка экрана

Enter-Pssession - запуск сеанса Powershell. Указание параметра -ComputerName позволяет создать сеанс на удалённом компьютере.

Exit-Pssession - завершение сеанса.

Для сбора информации об установленных приложениях средствами PowerShell используется класс WMI - Win32_Product. Результатом работы кода:

 
  1. Get-WmiObject -Class Win32_Product | Sort-Object Vendor, Name | Format-Table Vendor, Name, Version  

Будет таблица содержащая сведения об установленном программном обеспечении.

Однако надо сказать, что классу Win32_Product присущ ряд ограничений. Он считывает имена лишь тех приложений, которые были установлены с помощью службы Windows Installer. Имена приложений, установленных иными способами, с помощью данного класса не считываются. Это значит, что использование класса Win32_Product с целью осуществления общего аудита программных средств невозможно, кроме тех случаев, когда для установки пакетов используется исключительно установщик Windows, а это практически неосуществимо для большинства сетей. Считывание экземпляров класса Win32_Product выполняется весьма медленно. Не всегда возможно считывание экземпляров класса Win32_Product с удаленных компьютеров. Так, когда я пытаюсь выполнить подобную процедуру в своей сети, то получаю сообщение об ошибке Generic failure. Из-за перечисленных проблем целесообразность применения класса WMI Win32_Product снижается. Однако имеется альтернативный метод получения информации об установленных приложениях — непосредственно из реестра. Данные об установленных на компьютере приложениях содержатся в разделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ Windows\CurrentVersion\Uninstall. В каждом подразделе раздела Uninstall представлено установленное приложение, а значения в каждом подразделе отображают информацию о соответствующем приложении, как показано на экране. Таким образом, чтобы получить список приложений, можно «прочесать» раздел Uninstall и считать данные каждого подраздела, входящего в раздел Uninstall.

Провайдер реестра PowerShell дает возможность выполнять команду Get-ChildItem для получения списка имен приложений, установленных на исследуемом компьютере:

 
  1. Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | ForEach-object {(Get-ItemProperty Microsoft.PowerShell.Core\Registry::$_).DisplayName}  

Следующий код позволяет получить список всех запущенных процессов, получить пути и названия файлов, их запускающих, а также посмотреть дату создания таких файлов. В дополнение, отсортируем такой список по дате создания в убывающем порядке и отберем 10 наиболее "свежих" из них. Добавим к выводной информации также время последней модификации файла. Процессы с именами "System" и "Idle" из рассмотрения исключим, так как они не содержат пути к файлам.

 
  1. Get-Process |   
  2. where-Object {"System""Idle" -notContains $_.Name} |   
  3. Get-Item | Sort CreationTime -desc |   
  4. Select Directory, Name, CreationTime, LastWriteTime -first 10  

Рассмотрим действия кода по шагам. Сначала мы получаем список процессов с помощью командлета Get-Process. Эти данные передаются по конвейеру далее и фильтруются по условиям, заданным в where-Object (мы откидываем процессы с именами "System" и "Idle"). Следующий элемент конвейера - Get-Item возвращает атрибуты отобранных объектов. Осталось их отсортировать (время создания в убывающем порядке) и выбрать интересующие нас значения (имена папки и исполняемого файла, время создания и последней модификации файла). Последний параметр, -first 10 указывает, что выводиться будут лишь первые 10 элементов из списка объектов.