- Как вывести список установленных программ в Windows 10
- Вывод списка программ с помощью утилиты командной строки WMIC
- Вывод списка программ через Windows PowerShell
- Сбор данных об установленных программах во всем AD с Powershell
- Получение списка программ
- Удаленное подключение к компьютерам
- Создание командлета
- Исключение программ
- Получение списка компьютеров
- Экспорт данных в CSV и открытие в Excel
- Как получить список установленных в Windows 10 десктопных и UWP-программ с помощью PowerShell
Как вывести список установленных программ в Windows 10
В этой инструкции мы покажем несколько способов получить список установленных программ в Windows 10, Windows 8 или Windows 7 с помощью командной строки. Эта методика построения списка программ в системе может пригодиться перед переустановкой системы, когда нужно найти нежелательное ПО или при выполнении инвентаризации установленного ПО на компьютерах организации.
Рассмотрим два способа: первый подразумевает использование командной строки и утилиты wmic, второй — PowerShell.
Вывод списка программ с помощью утилиты командной строки WMIC
Список установленных в системе программ может быть получен с помощью утилиты командной строки WMIC, через которую можно обратиться и опросить пространство имен WMI. Запустите командную строку с правами администратора и выполните команду:
wmic product get name,version
После небольшого ожидания, на экран консоли будет выведен список названий и версия установленных в системе программ.
Этот список можно экспортировать в текстовый файл с помощью команды:
wmic product get name,version /format:csv > c:\Temp\Programs_%Computername%.csv
После окончания выполнения команды перейдите в каталог C:\Temp и найдите csv файл, имя которого начинается с Programs_[имя_ПК]. В данном файле в csv-формате помимо названия и версии ПО, также будет содержаться имя ПК (удобно для дальнейшего анализа).
Вывод списка программ через Windows PowerShell
Список установленных программ также может быть получен с помощью PowerShell. Идея метода в том, что список установленных программ, который мы видим в списке Programs and Features Панели Управления, строится на основе данных, хранящихся в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
Наша задача – вывести содержимое данной ветки реестра. Итак, запустите консоль Powershell и выполните команду:
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, Size, InstallDate | Format-Table -AutoSize
Как вы видите, в результирующем списке содержится имя программы, версия, разработчик и дата установки.
Экспортировать полученный список в csv файл можно так:
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize > c:\temp\ installed-software.txt
Рассмотренный выше способ позволяет вывести данные только о классический Windows приложениях. Чтобы вывести список установленных Metro приложений, воспользуйтесь командой:
Get-AppxPackage | Select Name, PackageFullName |Format-Table -AutoSize > c:\temp\installed_metro_apps.txt
Чтобы получить список установленного ПО на удаленном компьютере (к примеру, с именем wks_name11), воспользуемся командлетом Invoke-command:
Invoke-command -computer wks_name11
Чтобы сравнить списки установленного ПО, полученные с двух разных компьютеров и найти отсутствующие приложения, можно воспользоваться такой командой:
Compare-Object –ReferenceObject (Get-Content C:\temp\installed-software.txt) –DifferenceObject (Get-Content C:\temp\installed-software2.txt)
В нашем примере в двух сравниваемых списках имеются различия в двух программах.
Другой способ вывести список установленных программ – воспользоваться командлетом Get-WmiObject, также позволяющего обращаться с пространству WMI:
Get-WmiObject -Class Win32_Product | Select-Object -Property Name
Сбор данных об установленных программах во всем AD с Powershell
Для сбора списка программ используя Powershell есть много методов. Это может быть win32_product, команда Get-AppxPackage и многие другие. У большинства методов есть два минуса:
- Они выполняются очень долго (win32_product может выполняться несколько минут);
- Методы возвращают не все установленные программы.
Для обхода этих проблем, в примерах ниже, будет использоваться способ используя ключ реестра. Конечной целью будет получения списка всех программ со всего AD и последующий экспорт CSV (Excel). Так же будет показан способ исключения из списка тех программ, которые являются стандартными для компании.
Навигация по посту
Получение списка программ
Ключ реестра, который содержит все программы следующий:
Список программ можно получить так:
Если взглянуть на вывод, то можно подумать, что нам нужно свойство Name, так как оно лучше всего соответствует названию программы, но этот выбор будет некорректный. Вместо значений свойства Name можно увидеть идентификаторы приложения, а вот DisplayName выглядит корректно:
В примерах ниже я буду получать только значения из колонки Property DisplayName и DisplayVersion. Вы легко можете добавить другие значения, если вас заинтересуют, сами.
Команда, которая вернет только версию и отображаемое имя:
Примеры скриптов проверяются на Windows Server 2019 и Windows 10. На серверной версии появляются пустые строки связанные с нестандартными объектами:
Я решил их не включать в список программ, так как они относятся к системным программам установленными вместе с ОС. Скрипт, который исключит их, выглядит так:
Удаленное подключение к компьютерам
Так как скрипт должен подключаться к удаленным компьютерам я добавлю командлет PSRemoting (WinRM). Эта технология нуждается в предварительных настройках. В доменных сетях, при использовании DNS имен компьютеров, может все сработать и без этого. Проверить работу этой возможности с помощью следующего командлета:
Если у вас появляются ошибки, то советую проверить, что консоль Powershell запущена от имени администратора и служба включена:
Используя только описанные методы у нас получится достаточно сложный скрипт, который будет иметь следующую логику:
Что бы избежать такого сложно читаемого кода я объединю все это в одну функцию-командлет.
Создание командлета
Команда, которая вернет список программ с любого компьютера будет выглядеть так:
Если вы планировали добавить больше, а не только имя и версию, то его нужно добавить в месте на скриншоте:
После этого мы сможем получать наш список следующими способами:
Отмечу, что команда Get-Programs перестанет работать после завершения сессии пользователя и затем ее понадобится объявлять заново. Если вы хотите что бы они импортировались автоматически почитайте конец статьи «Как создавать команды и функции в Powershell вызывать их и передавать параметры».
Исключение программ
Исключить определенные программы мы можем по нескольким причинам. Это могут быть:
- Стандартные программы. Например Adobe Reader будет на большинстве компьютеров.
- Не несут информационной пользы. В список программ могут входить пакеты обновлений.
Я создал следующий список:
Использование знака * в названиях говорит, что в этой части строки может находится еще текст, но не обязательно.
Для исключения программ я сделал еще один командлет, который будет принимать 2 параметра:
- Список программ в переменной $Programs
- Список исключений в переменной $ExcludeList
Теперь мы можем исключать программы так:
Получение списка компьютеров
Следующая команда вернет список всех компьютеров которые есть в AD:
Она сработает в случаях если у вас установлен RSAT, импортирован модуль AD или вы на сервере с AD.
Следующим способом мы получим только имена компьютеров:
Мы можем использовать эту команду без дополнительных параметров, но могут быть ошибки:
Если не учитывать особенности вашей инфраструктуры, то причины в основном 3:
- Компьютер выключен.
- Компьютер отключен как учетная запись.
- На указанном компьютере не настроен WinRM (PSRemoting), не открыт порт или нет нужных привилегий на такую команду.
О третьей причине мы уже говорили. Что касается первых двух мы можем их решить.
В случае если отключены учетные записи компьютеров, то отфильтровать их можно так:
Выключенные компьютеры можно проверить через команду Test-NetConnection (аналог ping):
Плюсы метода выше в том, что вы получите список компьютеров, которые оффлайн. Минусы в том, что вы не можете изменить время возвращения ответа на ICMP пакет, а оно будет длиться 3-7 секунд.
И последний пример — это использовать возможность игнорирования ошибок через -ErrorAction SilentlyContinue. Этот пример самый быстрый, но вы не получите список исключенных компьютеров в чистом виде:
Экспорт данных в CSV и открытие в Excel
Команда, которая эскортирует данные, называется Export-CSV. Если вы не исключаете программы, то можете выполнить ее так:
В нашем случае файл будет сохранен на диске C, под именем programs.csv. При появлении ошибок при экспорте с кодировками, делиметром (разделителем), до записью вы можете попробовать исправить прочитав эту статью «Powershell экспорт и запись в CSV файл».
Если вы исключаете программы, то можете выполнить ее так:
Открыв Excel и выбрав следующий пункт выберете файл в проводнике:
В новом окне посмотреть на разделитель, который используется, и нажать «Далее»:
Выбрать разделитель (будет либо запятая или точка-запятая):
Результат будет примерно следующим:
Если выделить шапку (как в примере выше) и нажать «Фильтр», то сможете более удобно фильтровать результат.
Как получить список установленных в Windows 10 десктопных и UWP-программ с помощью PowerShell
Просмотр содержимого открываемой командой Shell:AppsFolder служебной папки Applications и использование сторонних инструментов вроде CCleaner — не единственные способы получить список всех установленных на компьютере приложений, хотя нужно признать, что CCleaner в этом отношении просто замечательна. С поставленной задачей в Windows 10 неплохо справляется также консоль PowerShell и это тем более, что полученные результаты можно легко экспортировать в текстовый файл.
Для создания списка десктопных и универсальных приложений в консоли предусмотрены отдельные команды. Чтобы получить список обычных программ, запустите Повершелл от имени администратора и выполните вот такую длинную команду:
Get-ItemPropery HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize > C:\deskprog.log
Если выполнить ее без перенаправления в файл лога, то есть без «> C:/deskprog.log» , данные будут выведены прямо в консоль.
Если у вас 32-битная система, команда будет выглядеть немного иначе, в любом случае мы получаем данные из указанных в команде ключей реестра, применяя форматирования для удобного чтения данных:
Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize > C:\deskprog.log
Да, если в вашей 64-битной системе установлены 32-битные приложения, следует выполнить и вторую команду, сохранив данные в отдельный лог. Открыв его Блокнотом, вы увидите отформатированный список установленных программ с указанием их версии, разработчика и даты установки.
Наконец, для получения списка универсальных приложений используется такая команда, она работает и в 32-битных, и в 64-битных Windows 10: