Как стать автором
Обновить
Петрович-Тех
DIY, e-com, экосистема сервисов

Как сделать, чтобы ссылки sip, tel и другие открывались определённым приложением

Время на прочтение5 мин
Количество просмотров853

Всем привет! Это снова Саша Басун — системный администратор «Петрович-Теха». Я пришёл поделиться решением проблемы, которая периодически встречалась мне раньше. Правда, потребность в её решении не была критичной, так как затрагивала минимум пользователей.

Другое дело, когда проблема появляется уже у десятка, а то и у сотни пользователей. Здесь без логичного решения уже не обойтись. Так произошло и в этот раз, но давайте по порядку. Все началось с ухода эпохи Skype и с Windows, не видящего корпоративный софтфон.

Что случилось?

Все помнят новость об очередной ушедшей эпохе: в мае 2025 года Skype прекратит свою работу. И взамен Microsoft предлагает другой продукт — Teams.

Тут и начались приключения. После установки Teams принудительно перехватывает на себя ассоциации для URL следующих типов: msteams://, msteamscanary://, callto://, im://, sip://, sips://, tel://.

Когда твоя деятельность не связана со звонками, по сути всё равно, что там перехватил Teams. Но когда в работе у коллег используется софтфон, открывать ссылки становится проблематично.

Ещё неприятнее, если Windows попросту не видит этот софтфон как приложение.

«Сейчас я расскажу вам секрет приготовления…»

Первым делом я подумал: «Раз в приложениях по умолчанию для различных типов файлов, ссылок и протоколов появляются приложения, которые можно выбрать, то они точно регистрируются в реестре Windows». И это действительно так. Рецепт кроется в трёх ветках реестра:

  • Classes;

  • Capabilities;

  • RegistredApplications.

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

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

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

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

— Приложение может зарегистрироваться в качестве обработчика для заданного URI, чтобы при открытии пользователем ссылки на указанный URI вместо браузера запускалось приложение, —  сообщается в документации.

Как это выглядит схематично: в подразделе с названием приложения мы создаём подраздел Capabilities, а внутри него — подраздел UrlAssociations. В UrlAssociations создаётся ключ со значением класса.

В RegistredApplication мы указываем путь до подраздела Capabilities нужного нам приложения. В классе непосредственно надо указать путь до самого приложения, которым мы собираемся открывать ссылки вида sip://.

Проще говоря: в подразделе RegistredApplication создаётся ссылка на подраздел Capabilities, где в подразделе UrlAssociations создаётся ссылка на класс.

Готовим файл реестра

Для начала нужно определить, какое приложение будет ассоциироваться со ссылками типа sip. Конечно, можно показать, как это делается непосредственно через редактор реестра. Но файликом будет быстрее. Открываем блокнот и добавляем следующие строки:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Classes\sip]
"URL Protocol"="URL:sip-protocol"
@="URL:sip-protocol"
"EditFlags"=dword:00000002

[HKEY_CURRENT_USER\SOFTWARE\Classes\sip\DefaultIcon]
@="\"C:\\Program Files (x86)\\AppName\\app.exe,0"

[HKEY_CURRENT_USER\SOFTWARE\Classes\sip\shell]

[HKEY_CURRENT_USER\SOFTWARE\Classes\sip\shell\open]

[HKEY_CURRENT_USER\SOFTWARE\Classes\sip\shell\open\command]
@="\"C:\\Program Files (x86)\\AppName\\app.exe\" \"%L\""

(Не нашёл синтаксис для реестра, потому для оформления выбрал C#)

Как правило, в Windows для ссылок типа sip изначально дефолтные настройки, которые не требуют редактирования. Если нет, то лучше прописать, как указано выше.

[HKEY_CURRENT_USER\SOFTWARE\Classes\sip\DefaultIcon]
@="\"C:\\Program Files (x86)\\AppName\\app.exe,0"

Подраздел DefaultIcon предназначен для указания иконки приложения. Вообще он не обязателен, но если очень хочется, то можно указать путь до нужного нам приложения. Параметр «0» после запятой указывает, что мы берем иконку указанного файла.

[HKEY_CURRENT_USER\SOFTWARE\Classes\sip\shell\open\command]
@="\"C:\\Program Files (x86)\\AppName\\app.exe\" \"%L\""

В подразделе comman указывается путь до приложение, которое и будет открывать ссылки sip. Параметр %L нужен для того, чтобы система отдала длинный путь.

Далее мы находим в ветке реестра Software подраздел нашего приложения. Если нет, можно этот подраздел создать. Внутри нам нужно создать подраздел Capabilities, а уже в нём — подраздел UrlAssociations.

[HKEY_CURRENT_USER\SOFTWARE\AppName\Capabilities]

[HKEY_CURRENT_USER\SOFTWARE\AppName\Capabilities\UrlAssociations]
"sip"="sip"

В подразделе UrlAssociations мы создаём строковый ключ sip со значением sip. Он и будет отсылать нас к HKEY_CURRENT_USER\SOFTWARE\Classes\sip.

Последний шаг — регистрируем приложение. Для этого в подразделе RegisteredApplications нужно создать строковый ключ, где его значение будет ссылаться на раздел HKEY_CURRENT_USER\SOFTWARE\AppName\Capabilities

[HKEY_CURRENT_USER\SOFTWARE\RegisteredApplications]
"AppName"="SOFTWARE\\Naumen\\Softphone\\Capabilities"

Полный текст будущего reg-файла выглядит так:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Classes\sip]
"URL Protocol"="URL:sip-protocol"
@="URL:sip-protocol"
"EditFlags"=dword:00000002

[HKEY_CURRENT_USER\SOFTWARE\Classes\sip\DefaultIcon]
@="\"C:\\Program Files (x86)\\AppName\\app.exe,0"

[HKEY_CURRENT_USER\SOFTWARE\Classes\sip\shell]

[HKEY_CURRENT_USER\SOFTWARE\Classes\sip\shell\open]

[HKEY_CURRENT_USER\SOFTWARE\Classes\sip\shell\open\command]
@="\"C:\\Program Files (x86)\\AppName\\app.exe\" \"%L\""

[HKEY_CURRENT_USER\SOFTWARE\AppName\Capabilities]

[HKEY_CURRENT_USER\SOFTWARE\AppName\Capabilities\UrlAssociations]
"sip"="sip"

[HKEY_CURRENT_USER\SOFTWARE\RegisteredApplications]
"AppName"="SOFTWARE\\Naumen\\Softphone\\Capabilities"

Сохраняем файл с расширением .reg и запускаем. После этого в приложениях по умолчанию для протокола sip появится наше приложение.

Результат
Результат

Пара нюансов

Этот вариант работает для конкретного пользователя, и он его сможет запустить самостоятельно. Если вы хотите это сделать для всех пользователей, например, в том же домене, то необходимо при создании файла вместо раздела HKEY_CURRENT_USER использовать HKEY_LOCAL_MACHINE. Все соответствующие подразделы там есть. Затем можно распространить этот файл при помощи групповых политик.

Почему при этом не используется HKEY_CLASSES_ROOT? Этот раздел как раз хранит в себе ключи из HKEY_CURRENT_USER\SOFTWARE\Classes и HKEY_LOCAL_MACHINE\SOFTWARE\Classes.

Такое сопоставление можно использовать не только для существующих приложений, но и для вашего собственного, которое должно открывать ссылки определённого типа. 

Только во время написания статьи нашёл похожее решение в интернете. Но, согласитесь, куда приятнее, когда додумался самостоятельно. Пускай инструкций будет больше: освежим решение в коллективной памяти :)

Теги:
Хабы:
+4
Комментарии0

Публикации

Информация

Сайт
petrovich.tech
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия