Отчёт об установленном ПО через PowerShell

Быстрые ссылки
Где регистрируется ПО
Требования для удалённых ПК
Использование модуля PSSoftware
Примеры и шаблоны
Безопасность и конфиденциальность
Сводка
Где регистрируется ПО
Термин «программное обеспечение» на Windows довольно общий. Установщик может изменять файлы, создавать ключи реестра, добавлять записи WMI и т.д. Для надёжной инвентаризации важно понимать, где искать сведения.
В большинстве современных версий Windows информация об установленном ПО доступна в реестре. В статье рассматриваются три родительских раздела, под которыми обычно создаются записи о ПО в виде дочерних ключей (часто с GUID):
- HKEY_LOCAL_MACHINE (32‑бит путь)
- HKEY_LOCAL_MACHINE6432Node (64‑бит путь)
- HKEY_CURRENT_USER (для каждого профиля пользователя)
Каждый дочерний ключ обычно содержит значения с названием продукта, версией, строкой удаления и другими метаданными. В зависимости от инсталлятора записи могут отсутствовать, находиться в альтернативных местах реестра или присутствовать только для одного профиля.
Важно: хотя некоторые сведения доступны через WMI, поиск по реестру обычно даёт более полный список записей.
Требования для удалённых ПК
Для исполнения команд из этой статьи предполагается, что на удалённых компьютерах включён PowerShell Remoting (WinRM) и они доступны по сети. Простой тест — выполнить команду:
Invoke-Command -ComputerName REMOTEPCNAME -ScriptBlock {1}Если команда не проходит, сначала устраните проблемы с сетевой доступностью и настройками WinRM/Firewall. Без рабочего удалённого соединения подходы, описанные ниже, работать не будут.
Важно: в средах с ограниченной сетью или политиками безопасности могут быть запрещены удалённые вызовы. В таких случаях используйте агентные решения (SCCM, Intune) или собирайте данные локально и централизуйте их позже.
Использование модуля PSSoftware
Чтобы не писать всё с нуля, можно установить готовый модуль PSSoftware из PowerShell Gallery. В административной сессии выполните:
Install-Module PSSoftwareПроверьте команды модуля:
Get-Command -Module PSSoftware -Noun SoftwareВы увидите команды вроде Get-InstalledSoftware, Install-Software и Remove-Software. В этой статье акцент на Get-InstalledSoftware.
Запустите команду локально без параметров, чтобы увидеть полный вывод:
Get-InstalledSoftwareПример вывода (урезано):
PS51> Get-InstalledSoftware
ModifyPath : MsiExec.exe /I{4CF4DB38-0692-4A5B-BCE8-1667C51E8416}
VersionMajor : 14
Version : 14.0.500.272
InstallSource : C:ProgramDataPackage Cache{4CF4DB38-0692-4A5B-BCE8-1667C51E8416}v14.0.500.272x64
InstallDate : 20170716
Publisher : Microsoft Corporation
Name : SQL Server vNext CTP2.0 XEvent
GUID : {4CF4DB38-0692-4A5B-BCE8-1667C51E8416}
PSComputerName : MACWINVM
--snip--Ограничьте вывод до названия и версии:
Get-InstalledSoftware | Select-Object -Property Name,VersionФильтрация по названию (начинается на “SQL”):
Get-InstalledSoftware | Where-Object {$_.Name -like 'SQL*'} | Select-Object -Property Name,VersionЧтобы получить данные с удалённого компьютера, используйте параметр ComputerName или Invoke-Command.
Get-InstalledSoftware -ComputerName REMOTEPCNAME
# Или
Invoke-Command -ComputerName REMOTEPCNAME -ScriptBlock { Get-InstalledSoftware }Примеры и шаблоны
Ниже — набор практических шаблонов, которые часто используются при сборе инвентаризации.
Получить список с нескольких компьютеров и экспортировать в CSV:
$computers = Get-Content -Path '.\computers.txt'
$results = foreach ($c in $computers) {
try {
Get-InstalledSoftware -ComputerName $c | Select-Object PSComputerName,Name,Version,Publisher,InstallDate
} catch {
[PSCustomObject]@{PSComputerName=$c; Name='ERROR'; Version=$_.Exception.Message}
}
}
$results | Export-Csv -Path '.\software-inventory.csv' -NoTypeInformation -Encoding UTF8Параллельный опрос с использованием Invoke-Command для повышения скорости:
Invoke-Command -ComputerName $computers -ScriptBlock { Import-Module PSSoftware; Get-InstalledSoftware } -ThrottleLimit 20 |
Select-Object PSComputerName,Name,Version | Export-Csv .\parallel-inventory.csv -NoTypeInformationФильтрация по списку запрещённых приложений:
$blacklist = @('ToolA','OldApp')
$results | Where-Object { $blacklist -contains $_.Name }Отправка отчёта ответственному через почту (пример):
$csv = '.\software-inventory.csv'
Send-MailMessage -To 'admin@example.com' -From 'noreply@example.com' -Subject 'Software inventory' -SmtpServer 'smtp.example.com' -Attachments $csvКогда это не работает — типичные причины и исправления
- WinRM/PowerShell Remoting отключён. Проверьте и включите через Enable-PSRemoting при необходимости.
- Firewall блокирует порты. Откройте WinRM порты или используйте HTTPS/SSH Remoting.
- Права доступа. Выполняйте команды от имени администратора или используйте делегированные учётные данные.
- Записи об установке отсутствуют в реестре (установщик не добавил запись). В таких случаях комбинируйте методы: реестр + WMI + анализ установленных файлов.
- Get-WmiObject Win32_Product показывает не всё и может инициировать переустановку MSI — избегайте этого метода для массового опроса.
Альтернативные подходы
- Централизованные системы управления (SCCM/MECM, Intune) дают полный контроль и управление на масштабе, но требуют лицензирования.
- Агентные решения (например, сторонние инвентаризаторы) устанавливают небольшого агента на машину и отправляют данные в центр.
- Анализ логов развёртывания и пакетов (если вы используете пакетный деплой) для построения инвентаря.
Каждый подход имеет trade‑offs: стоимость, точность, частота обновлений, безопасность и требование прав.
Ментальные модели и эвристики
- «Где‑то есть запись» — сначала ищите в реестре, затем в WMI, затем в файловой системе.
- «Проверяй сразу несколько источников» — никакой отдельный источник не даёт 100% покрытия.
- «Сбор → Нормализация → Отчёт» — сначала собираем исходные данные, затем приводим их к единому виду, потом формируем отчёт.
Мини‑методология для одного цикла инвентаризации
- Сбор: опросить целевые хосты модулем PSSoftware или Invoke-Command.
- Нормализация: привести имена, версии и издателей к единому формату.
- Анализ: сравнить с корпоративным списком поддерживаемых приложений.
- Действие: удалить запрещённые, обновить устаревшие, исправить конфигурации.
- Отчётность: экспортировать CSV/Excel и уведомить заинтересованные стороны.
Чек‑лист по ролям
Для системного администратора:
- Проверить доступность WinRM.
- Обновить модуль PSSoftware на последних рабочих станциях.
- Настроить расписание сбора.
Для инженера безопасности:
- Сверить список приложений с политикой безопасности.
- Пометить уязвимые версии для немедленного обновления.
Для аудитора:
- Экспортировать неизменяемый отчёт (CSV/JSON) с временными метками.
- Убедиться, что данные покрывают все целевые сегменты сети.
Безопасность и конфиденциальность
- Используйте минимум привилегий: по возможности не запускайте массовые опросы с глобальными учётными записями.
- Шифруйте транспорт (например, WinRM по HTTPS) и храните отчёты в защищённом хранилище.
- Избегайте передачи персонально‑идентифицируемых данных (PII). Если в отчётах появляются данные пользователей, примените маскирование или политики доступа.
- Для организаций в зоне GDPR или аналогичных регуляций проверьте правовую основу для сбора метаданных ПО и храните логи в рамках политики хранения данных.
Шпаргалка команд (cheat sheet)
- Установка модуля:
Install-Module PSSoftware- Просмотр установленных программ локально:
Get-InstalledSoftware | Select-Object Name,Version,Publisher- Сбор с удалённого хоста:
Get-InstalledSoftware -ComputerName REMOTEPC- Параллельный сбор и экспорт:
Invoke-Command -ComputerName (Get-Content computers.txt) -ScriptBlock { Import-Module PSSoftware; Get-InstalledSoftware } -ThrottleLimit 20 |
Select-Object PSComputerName,Name,Version | Export-Csv .\inventory.csv -NoTypeInformationСводка
PowerShell вместе с модулями сообщества предоставляет быстрый и бесплатный путь к созданию отчётов об установленном ПО. Понимание того, где система хранит информацию об установках, и настройка безопасного удалённого доступа — ключевые шаги. По мере роста масштаба переходите на агентные или централизованные системы управления для надёжности и снабжения SLA.
Важно: комбинируйте несколько источников данных и регулярно проверяйте процессы, чтобы поддерживать точность инвентаризации.
Критерии приёмки
- Все целевые хосты опрашиваются по расписанию.
- Отчёт содержит PSComputerName, Name, Version и InstallDate либо явную пометку об ошибке опроса.
- Отчёты экспортируются в защищённое хранилище и доступны уполномоченным лицам.
Полезные ссылки
- PowerShell Gallery: https://www.powershellgallery.com