Доступ к приложениям, спроектированным для использования установщика Windows, может быть получен через класс WMI Win32_Product, но в настоящее время не все приложения используют установщик Windows. Установщик Windows предоставляет широчайший спектр стандартных методов работы с устанавливаемыми приложениями, поэтому главное внимание будет уделяться именно этим приложениям. Приложения, для которых предусмотрены другие процедуры установки, обычно не управляются установщиком Windows. Особенные способы работы с такими приложениями зависят от программного обеспечения установщика и решений, принятых разработчиками приложений.

Примечание.

Использование рассматриваемых способов обычно невозможно для управления приложениями, которые устанавливаются копированием файлов приложения на компьютер. Такие приложения можно обрабатывать как отдельные файлы и папки, используя методы, рассмотренные в разделе "Работа с файлами и папками".

Получение списка приложений, установленных при помощи установщика Windows

Чтобы построить список приложений, установленных на локальной или удаленной системе при помощи установщика Windows, можно использовать несложный запрос WMI:

PS> Get-WmiObject -Class Win32_Product -ComputerName .
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
Name			: Microsoft .NET Framework 2.0
Vendor			: Microsoft Corporation
Version		 : 2.0.50727
Caption		 : Microsoft .NET Framework 2.0

Чтобы вывести на экран все свойства объекта Win32_Product, используйте параметр Properties командлетов форматирования, например командлета Format-List, со значением * (все).

PS> Get-WmiObject -Class Win32_Product -ComputerName . | Where-Object -FilterScript {$_.Name -eq "Microsoft .NET Framework 2.0"} | Format-List -Property *
Name			: Microsoft .NET Framework 2.0
Version		 : 2.0.50727
InstallState	: 5
Caption		 : Microsoft .NET Framework 2.0
Description	 : Microsoft .NET Framework 2.0
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
InstallDate	 : 20060506
InstallDate2	: 20060506000000.000000-000
InstallLocation   :
PackageCache	: C:\WINDOWS\Installer\619ab2.msi
SKUNumber		 :
Vendor			: Microsoft Corporation

Чтобы выбрать только Microsoft .NET Framework 2.0, можно также воспользоваться параметром Get-WmiObject Filter. В этой команде использован фильтр WMI, который следует не синтаксису фильтров Windows PowerShell, а синтаксису языка WQL. Вместо этого введите:

Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='Microsoft .NET Framework 2.0'"| Format-List -Property *

Запросы WQL часто содержат знаки (например, пробелы и знаки равенства), которые имеют в Windows PowerShell специальное значение. Поэтому рекомендуется всегда заключать значение параметра Filter в кавычки. Может быть использован и управляющий знак Windows PowerShell гравис (`), однако при этом чтение команды становится менее удобным. Следующая команда эквивалентна предыдущей, она возвращает тот же результат, однако вместо заключения всей строки фильтра в кавычки в ней применен специальный управляющий символ гравис.

Get-WmiObject -Class Win32_Product -ComputerName . -Filter Name`=`'Microsoft` .NET` Framework` 2.0`' | Format-List -Property *

Чтобы вывести только желаемые свойства, используйте параметр Property командлетов форматирования для перечисления этих свойств.

Get-WmiObject -Class Win32_Product -ComputerName . | Format-List -Property Name,InstallDate,InstallLocation,PackageCache,Vendor,Version,IdentifyingNumber
...
Name			: HighMAT Extension to Microsoft Windows XP CD Writing Wizard
InstallDate	 : 20051022
InstallLocation   : C:\Program Files\HighMAT CD Writing Wizard\
PackageCache	: C:\WINDOWS\Installer\113b54.msi
Vendor			: Microsoft Corporation
Version		 : 1.1.1905.1
IdentifyingNumber : {FCE65C4E-B0E8-4FBD-AD16-EDCBE6CD591F}
...

Наконец, если необходимо определить только имена установленных приложений, сократить вывод позволит следующая простая инструкция Format-Wide:

Get-WmiObject -Class Win32_Product -ComputerName .  | Format-Wide -Column 1

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

Получение списка приложений, поддерживающих удаление

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

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall.

Этот раздел также можно проверить, чтобы найти приложения. Просмотр раздела Uninstall можно упростить, отобразив соответствующее положение в реестре на диск Windows PowerShell:

PS> 

Name	 Provider	Root								 CurrentLocation
----	 --------	----								 ---------------
Uninstall  Registry	HKEY_LOCAL_MACHINE\SOFTWARE\Micr...
Примечание.

Диск HKLM: отображает корневой раздел HKEY_LOCAL_MACHINE, поэтому он и был использован в пути к разделу Uninstall. Вместо HKLM: можно указать путь к разделу реестра, используя разделы HKLM или HKEY_LOCAL_MACHINE. Использование существующего диска реестра удобнее, так как вместо ввода имен разделов вручную позволяет воспользоваться функцией автозавершения по нажатию клавиши TAB.

Созданный диск с именем "Uninstall" делает поиск установленных приложений быстрым и удобным. Число установленных приложений можно определить, подсчитав количество разделов реестра на диске Uninstall: в Windows PowerShell:

PS> (Get-ChildItem -Path Uninstall:).Count
459

Дальнейший поиск в полученном списке приложений осуществляется разнообразными методами, начиная с использования командлета Get-ChildItem. Для получения списка приложений и их сохранения в переменной $UninstallableApplications используйте следующую команду:

$UninstallableApplications = Get-ChildItem -Path Uninstall:
Примечание.

Длинное имя переменной использовано здесь лишь для улучшения восприятия. На практике использование длинных имен не имеет особого смысла. Для имен переменных поддерживается автозавершение по нажатию клавиши TAB, но использование имен длиной в 1 - 2 знака позволяет ускорить ввод команд. Более длинные описательные имена наиболее полезны при разработке кода для повторного использования.

Для вывода значений записей реестра во вложенных разделах реестра раздела реестра Uninstall используйте метод GetValue для разделов реестра. Значение метода является именем записи в реестре.

Например, чтобы определить отображаемые имена приложений из раздела Uninstall, используйте следующую команду:

PS> Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("DisplayName") }

Уникальность этих значений не гарантирована. В следующем примере два установленных элемента отображаются как "Windows Media Encoder 9 Series":

PS> Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -eq "Windows Media Encoder 9 Series"}


   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Windows\CurrentVersion\Uninstall

SKC  VC Name						 Property
---  -- ----						 --------
  0   3 Windows Media Encoder 9		{DisplayName, DisplayIcon, UninstallS...
  0  24 {E38C00D0-A68B-4318-A8A6-F7... {AuthorizedCDFPrefix, Comments, Conta...

Установка приложений

Класс Win32_Product можно использовать для удаленной или локальной установки пакетов установщика Windows. При удаленной установке необходимо указать путь к устанавливаемому пакету MSI в виде сетевого UNC-пути, так как подсистема WMI не распознает пути Windows PowerShell. Например, для установки пакета NewPackage.msi, расположенного на общем сетевом ресурсе \\AppServ\dsp на удаленном компьютере PC01, введите в командной строке Windows PowerShell следующую команду:

(Get-WMIObject -ComputerName PC01 -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install(\\AppSrv\dsp\NewPackage.msi)

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

Удаление приложений

Удаление пакета, установленного при помощи установщика Windows, осуществляется в оболочке Windows PowerShell приблизительно так же, как и установка пакета. В следующем примере выбор пакета для удаления производится на основе его имени, но в отдельных случаях удобнее использовать фильтр IdentifyingNumber:

(Get-WmiObject -Class Win32_Product -Filter "Name='ILMerge'" -ComputerName . ).Uninstall()

Удаление других приложений несколько сложнее, даже если производится локально. Команды удаления таких приложений из командной строки содержатся в свойстве UninstallString. Следующий метод пригоден как для приложений, установленных при помощи установщика Windows, так и для старых программ, перечисленных в разделе Uninstall:

Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("UninstallString") }

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

Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -like "Win*"} | ForEach-Object -Process { $_.GetValue("UninstallString") }

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

Обновление приложений, установленных при помощи установщика Windows

Для обновления приложения необходимо знать имя обновляемого приложения и путь к пакету обновления приложения. При наличии этих сведений обновление приложения осуществляется в Windows PowerShell при помощи одной команды:

(Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='OldAppName'").Upgrade(\\AppSrv\dsp\OldAppUpgrade.msi)