Как узнать appid приложения в windows

Обновлено: 04.07.2024

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

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

Независимые провайдеры предлагают средства для мониторинга установленного программного обеспечения, но у небольших предприятий может не оказаться ресурсов для реализации такого решения. В нашей компании не было программного средства аудита, поэтому я написал сценарий Windows PowerShell Get-InstalledApp.ps1 (см. листинг). Перед тем как приступить к описанию процедуры использования этого сценария и механизма его работы, мне бы хотелось остановиться на двух методах обнаружения установленного программного обеспечения с помощью сценария и пояснить, чем меня привлек тот метод, на котором я остановил выбор.

Класс Win32_Product или реестр

В инструментарии управления Windows Management Instrumentation (WMI) имеется класс Win32_Product, который позволяет регистрировать приложения, установленные на компьютере. В среде PowerShell эта возможность реализуется просто. Так, команда

Get-WmiObject Win32_Product
| select name

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

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

Экран. Один из подразделов раздела Uninstall

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

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

Как работать со сценарием Get-InstalledApp.ps1

Сценарий Get-InstalledApp.ps1 считывает информацию об установленных приложениях из реестра, после чего возвращает либо список всех установленных приложений, либо список приложений, отвечающих заданным критериям. В сценарии используется следующий синтаксис командной строки:

Get-InstalledApp [-computername]
[-appID] [-appname]
[-publisher] [-version] [-matchall]

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

Параметр -appID используется для поиска приложений по их идентификаторам (application ID). Идентификатор приложения — это подраздел реестра, относящийся к разделу Uninstall. На экране идентификатор приложения выделен в левой панели. Для приложений, установленных с помощью установщика Windows, идентификактор приложения эквивалентен глобальному уникальному идентификатору (идентификатору GUID) ID продукта соответствующего приложения. Использование параметра -appID — лучший способ обнаружения конкретных приложений, установленных с помощью службы Windows Installer.

Параметр -version используется для поиска приложений по их версиям. Если вы не знаете наверняка, какова версия того или иного приложения, можете считать эти данные из параметра DisplayVersion подраздела этого приложения. К примеру, приложение, выделенное на экране, имеет версию 2.4.9286.16.

Если для файла Get-InstalledApp.ps1 указать ключ -matchall, сценарий будет выводить все соответствующие заданному критерию приложения, вместо того чтобы прекратить поиск после обнаружения первого соответствия. Так, команда

Get-InstalledApp -publisher
"Microsoft Corporation" -matchall

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

Все перечисленные ключи (-appID, -appname, -publisher и -version) — поддерживают поиск с использованием символов шаблонов; аргументы ключей нечувствительны к регистру. Так, команда

Get-InstalledApp -appname
"*office*" -matchall

выводит список всех установленных на исследуемом компьютере приложений, в именах которых есть слово office. Кроме того, для указания более детализированных критериев поиска можно указывать параметры -appID, -appname, -publisher и -version в любых сочетаниях. Так, команда

Get-InstalledApp sales01-appname
"*.NET Framework*" -version "2*"

Сценарий Get-InstalledApp.ps1 возвращает объекты, содержащие свойства ComputerName, AppID, AppName, Publisher и Version, поэтому вы можете использовать команды PowerShell и форматировать выходные данные в соответствии со своими потребностями. Так, команда

Get-InstalledApp | Select-Object AppName,
Version |
Sort-Object AppName

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

Get-InstalledApp (Get-Content
Computers.txt) |
Export-CSV Report.csv -notypeinformation

Параметр -NoTypeInformation команды Export-CSV блокирует передачу информации во выходной файл CSV. Команда

Get-InstalledApp (Get-Content
Computers.txt)
-appID " CD9E4E6262EF>" |
Select-Object ComputerName

Get-InstalledApp -publisher
"Microsoft Corporation" -matchall |
Select-Object AppName, Version |
Sort-Object AppName

Внутренние механизмы сценария Get-InstalledApp.ps1

Теперь, когда вы знаете, как пользоваться сценарием Get-InstalledApp.ps1, давайте посмотрим, каким образом он функционирует. Сначала с помощью команды param сценарий объявляет параметры командной строки; затем он создает две глобальные переменные для использования в дальнейшем при работе с классом StdRegProv. После этого сценарий объявляет функцию usage и главную функцию. Последняя строка сценария вызывает главную функцию.

Далее основная функция создает пустую хеш-таблицу и сохраняет ее в переменной $propertyList, как показано во фрагменте А листинга.

Если в командной строке имеется хотя бы один из параметров (-appID, -appname, -publisher или -version), функция добавляет к хеш-таблице ключ, соответствующий имени параметра, и задает значение этого ключа аргументу параметра. Так, команда

Get-InstalledApp -appname
"Windows Support Tools"

предписывает главной функции заполнить хеш-таблицу с помощью ключа AppName, который имеет значение Windows Support Tools.

Затем функция main выясняет, является ли пустым параметр computername. Если параметр пуст, функция использует имя локального компьютера, которое она получает из переменной среды COMPUTERNAME. Если же параметр не является пустым, функция перебирает массив имен компьютеров с помощью цикла foreach. Цикл выполняется только раз, если аргумент computername параметра представляет собой имя одного компьютера.

Внутри цикла foreach функция main объявляет переменную $err и задает ее значение равным $NULL. После этого с помощью специального блока сценария (trap scriptblock) функция выявляет ошибки WMI, как показано во фрагменте B листинга. При возникновении ошибки «ловушечный» блок сценария обновляет переменную ошибки до уровня текущей записи ошибки (то есть задает ей значение $ERROR [0]) и продолжает выполнение команды, следующей за ошибкой.

После этого функция main использует метод EnumKey класса StdRegProv для перечисления подразделов раздела Uninstall. Результат применения метода EnumKey — массив имен подразделов — хранится в свойстве sNames. Далее функция перебирает массив имен подразделов с помощью другого цикла foreach.

При обработке каждого представленного в массиве имени подраздела функция main с помощью метода GetStringValue класса StdRegProv считывает свойство DisplayName соответствующего раздела реестра. Используя команду Join-Path, функция присоединяет имя подраздела к ключу Uninstall. Образующийся в результате маршрут к реестру используется в качестве аргумента для метода GetStringValue, который возвращает значение записи реестра. Это должно быть строковое значение. Данный метод принимает три аргумента: ветвь реестра, путь к разделу и имя параметра. Значение GetStringValue возвращает объект, содержащий два свойства: свойство ReturnValue, которое включает значение, указывающее на успешный или неудачный вызов метода, и свойство sValue, содержащее строковое значение. Функция main присваивает значение свойства sValue переменной $name.

Если значение переменной $name не равно $NULL, функция main создает настраиваемый выходной объект, содержащий четыре свойства: ComputerName, AppID, AppName, Publisher и Version. Она обновляет свойство объекта ComputerName именем исследуемого компьютера, свойство объекта AppID — именем текущего подраздела, а свойство объекта AppName — отображаемым именем текущего приложения. Далее функция дважды применяет метод GetStringValue с целью извлечения значений записей Publisher и DisplayVersion для обновления соответствующих свойств в настраиваемом объекте с помощью этих значений.

Итак, функция main завершила получение информации о текущем приложении и теперь проверяет хеш-таблицу $propertyList на наличие ключей; для этого проверке подвергается свойство Count коллекции Keys. Если таблица хеширования не содержит ключей (иначе говоря, если в командной строке не представлен ни один из параметров (-appID, -appname, -publisher и -version)), тогда функция просто генерирует настраиваемый объект, чтобы выяснить, аргументы какого параметра командной строки соответствуют значениям свойств настраиваемого объекта. Фрагмент D листинга демонстрирует, каким образом функция main решает эту задачу.

Сначала значение переменной $matches задается равным 0, затем код проходит по всем элементам коллекции Keys хеш-таблицы $propertyList. Для каждого ключа в таблице хеширования $propertyList функция применяет оператор среды PowerShell -like, чтобы выяснить, соответствует ли данное свойство настраиваемого объекта равносильному значению хеш-таблицы $propertyList hashtable. В случае соответствия значений указанных элементов функция увеличивает значение переменной $matches. Если число соответствий равно числу ключей в таблице хеширования, функция main формирует настраиваемый объект. Наконец, если в командной строке отсутствует параметр -matchall, функция использует команду break для выхода из цикла foreach, который применяется для перебора подразделов реестра.

Сегодня я расскажу, как группировать несколько программ, разработчиком которых являетесь Вы, под один значок ярлыка в панели задач.
Метод работает для систем на базе ОС Windows 7/8/8.1/10.

Several_Programs.jpg

Начиная с Windows 7, в систему введено понятие идентификатора AppUserModelID. Далее, я буду его называть коротко – AppID.
Он представляет из себя строку до 128 символов максимум в формате CompanyName.ProductName.SubProduct.VersionInformation. Этот формат является рекомендованным, но не обязательным.

AppID может быть назначен:
– процессу;
– окну приложения;
– ярлыку LNK.

Сразу скажу: чтобы сгруппировать все приложения под один значок, Вы должны назначить этим процессам и ярлыку, закрепленному на панели задач, одинаковый AppID.

Это также повлияет на:
– порядок поиска ярлыка панели задач для приложения (если бинарный файл был перемещен, то закрепленный значок все равно будет найден при запуске приложения);
– скорость инициализации приложения;
– видимость ярлыков в меню ПУСК. Если Ваши ярлыки ведут к одному приложению и различаются только аргументами, то без AppID, в меню ПУСК будет виден только 1 ярлык, остальные – скрыты (актуально дли систем на базе ОС Windows 8/8.1/10)

Группировка нескольких программ под один значок может потребоваться по разным причинам. Например, Вы разрабатываете какое-нибудь хост-приложение, где порождается несколько дочерних процессов. При этом, данные процессы Вы не хотите скрывать, но и отображать миллион значков в панели задач для Вас тоже неприемлемо.

Рассмотрим как это сделать подробнее на примере браузера от Майкрософт – Project Spartan…

Бинарная структура предустановленного ярлыка Microsoft.Spartan.Spartan.lnk выглядит следующим образом:

Spartan AppID.jpg

Она показывает, что к LNK присоединен в качестве метаданных AppID приложения ProjectSpartan:
Microsoft.Windows.Spartan_cw5n1h2txyewy!Microsoft.Spartan.Spartan
(значение может изменяться от версии к версии).

Вы можете сделать тоже самое:

а) через инсталлятор приложения. Например, в AdminStudio через вкладу«Shell Properties»:

Admin Studio.jpg

б) модифицировав готовый ярлык, используя библиотеку shell32.dll:

1) Сперва следует загрузить ярлык с помощью метода Load интерфейса IPersistFile, унаследованного от IShellLink.
2) Затем записать соответствующие метаданные с помощью интерфейса IPropertyStore, указав в качестве идентификатора GUID AppUserModel_ID –

Set_AppID.jpg

в) Есть и неординарный способ (чисто ради эксперимента). Если Вашему процессу назначен AppID, после его запуска выберите из контекстного меню иконки в панели задач пункт «Закрепить программу в панели задач». Это создаст ярлык уже с метаданными.

Итак, записывать AppUserModelID в ярлык мы научились.


Часть 2. Для успеха нам требуется записать такой же AppID в само приложение.

Она принимает указатель на строку с AppUserModelID.

Эту функцию следует разместить перед прорисовкой формы приложения, т.е. в идеале – на этапе инициализации. Таким образом, мы явно назначаем AppID (он будет называться explicit AppUserModelID).

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


Тест возможностей

Для демонстрации, я возьму 2 независимые программы, написанные на VB6:

– HiJackThis by Trend Micro
– ClearLNK by Alex Dragokas

Мне будет проще показать это на видео:

Как узнать AppID ?

Нет документированного способа узнать AppID чужого приложения, разве что внедриться в него и вызвать функцию GetCurrentProcessExplicitAppUserModelID (при этом AppID, заданный неявно (implicit), она все равно не покажет).

Однако, ОС умеет это делать иным способом. И если покопаться глубже, то вполне возможно, что Вам повезет

Я же только расскажу, где его можно посмотреть:

1) Нажимаем комбинацию клавиш Win + R, вводим: shell:AppsFolder
2) Откроется окно с установленными программами и компонентами.
3) В правом углу выберите режим преставления – табличный.
Нажмите левый ALT, появится меню, выберите View -> Choose Details…, поставьте галочку на пункте «AppUserModelID», ОК.

Table_AppID.jpg

Кстати, запустить любое приложение из этого меню, используя его AppID, можно таким образом:

Уточню, что этим способом можно запустить только установленное приложение или компонент системы.


Зачем еще используется AppID ?

1) Jump List.

Зная AppID, Вы можете получить доступ к списку переходов (Jump list), например, для перечисления списка недавно открытых файлов в какой-нибудь программе.


2) Запуск приложения без указания полного пути.

Microsoft в новых ОС использует AppID, чтобы идентифицировать приложение.
Например, если Вы посмотрите на листинг структуры ярлыка Spartan, выложенный ранее, то не увидите прямых путей (разве что путь к каталогу).

AppID связан с Application Class примерно так:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\AppX6k1pws1pa7jjhchyzw9jce3e6hg6vn8d]

[HKEY_CLASSES_ROOT\AppX6k1pws1pa7jjhchyzw9jce3e6hg6vn8d\Shell\Open]
"ActivatableClassId"="Microsoft.Spartan.Spartan.AppXg7kxxh26qff97eq30vmjc45gmf279j0y.mca"
"ContractId"="Windows.File"
"PackageId"="Microsoft.Windows.Spartan_0.11.10074.0_neutral_neutral_cw5n1h2txyewy"
"DesiredInitialViewState"=dword:00000000

Соответственно, в Windows 10 (как в 8/8.1 не проверял), некоторым ассоциациям файлов также назначены Application Class вместо полного пути к приложению.

В Windows 10 каждому приложению, службе или процессу присвоен номер, известный как идентификатор процесса. Идентификатор процесса (или PID) в основном используется для идентификации каждого запущенного или приостановленного процесса в системе.

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

1. Используйте командную строку.

Хотя вы можете использовать командную строку для устранения проблем с Windows 10, вы также можете использовать ее для поиска идентификатора процесса приложения. Вот как это сделать:


Если вы хотите узнать идентификатор процесса для приложений Microsoft Store, введите список задач / приложения.

2. Используйте диспетчер задач.

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


Вы также можете увидеть, что PID отображается на вкладке «Службы».

3. Используйте PowerShell.

Вот как вы можете проверить идентификатор процесса приложения с помощью PowerShell:


PowerShell отобразит список идентификаторов процессов приложения вместе с дополнительной информацией о приложениях.

4. Используйте монитор ресурсов.


Монитор ресурсов также показывает, запущено или приостановлено приложение, в столбце «Состояние».

Найдите идентификатор процесса приложения с помощью этих инструментов Windows 10



Аноним

Подскажите, как теперь определять идентификатор приложения в Microsoft Store?

Т.е. как находить требуемую строку, на примере Snake Rewind, старая ссылка с идентификатором в Windows Phone Store выглядит так:

новая в Microsoft Store так:

hooddy, я думал меня одного волнует этот вопрос.

Ну я находил так:

  1. Ищешь нужную прогу в магазине на смартфоне 8.1 (не знаю, может и на 10 тоже пашет).
  2. Сворачиваешь, подключаешься к Fiddler.
  3. Разворачиваешь, нажимаешь установить.
  4. В фиддлере смотришь адрес к какому обратился смарт.

Но это геморой, тока что нашел другой способ:


  1. В браузере нажимаешь ПКМ -> Просмотр кода страницы.
  2. Откроется HTML-код страницы.
  3. Через поиск на странице ищешь строку data-legacy-phone-id или data-target-phone81 или data-target-phone-80-7x.
  4. А дальше все понятно где там ID.
Вложения:
В личке ваши проблемы не решаю и больше не помогаю, создавайте тему в форуме.



Аноним

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

Добавлено спустя 1 минуту 16 секунд:
О, второе да, очень круто!

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

Тут несколько вариантов:

  • Это может быть приложение написанное под Silverlight 8.1 (прим. офф клиент ВК). Такие приложения находятся в папке WindowsApps. Открыть ее можно было только на Samsung Ativ S с интеропом. Как ее сейчас открывать на других смартах не знаю, может твики реестра какие есть.
  • Это APPX. Тогда тут другая история, сливать надо через старый маркет.
В личке ваши проблемы не решаю и больше не помогаю, создавайте тему в форуме.



Аноним

WinPhone, все, что касается интеропа на Люмиях, можно забыть. Я не успел его сделать буквально неделю опоздал, как вышло обновление Extras&Info с прикрытой дырой. Но спасибо тоже за инфу.

Добавлено спустя 2 минуты 0 секунд:

Это APPX. Тогда тут другая история, сливать надо через старый маркет

Читайте также: