Поделиться через


Предоставление общего доступа к именованным объектам

В этом разделе объясняется, как совместно использовать именованные объекты между приложениями универсальной платформы Windows (UWP) и приложениями Win32.

Именованные объекты в упакованных приложениях

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

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

Создание именованных объектов

Именованные объекты создаются с помощью соответствующего API Create:

Все эти API предоставляют общий LPSECURITY_ATTRIBUTES доступ к параметру, который позволяет вызывающей программе указывать списки управления доступом (ACL) для управления доступом к объекту. Чтобы предоставить общий доступ к именованным объектам с упакованными приложениями, необходимо предоставить разрешение в списках управления доступом при создании именованных объектов.

Идентификаторы безопасности (SIDs) представляют удостоверения в рамках ACL. У каждого упаковаемого приложения есть собственный идентификатор безопасности на основе имени семейства пакетов. Идентификатор безопасности для упакованного приложения можно создать, передав имя семейства пакетов в функцию DeriveAppContainerSidFromAppContainerName.

Замечание

Имя семейства пакетов можно найти с помощью редактора манифеста пакета в Visual Studio во время разработки с помощью Центра партнеров для приложений, опубликованных в Microsoft Store, или с помощью команды Get-AppxPackage PowerShell для уже установленных приложений.

В этом примере показан базовый шаблон, необходимый для ACL именованного объекта. Чтобы предоставить общий доступ к именованным объектам с упакованными приложениями, создайте структуру EXPLICIT_ACCESS для каждого приложения:

Заполняя параметр LPSECURITY_ATTRIBUTES в вызовах Create правилами EXPLICIT_ACCESS для упакованных приложений, вы можете предоставить доступ к этим приложениям, чтобы открыть именованный объект.

Замечание

Приложения Win32 могут получить доступ ко всем именованным объектам, созданным упакованными приложениями, если они корректно указывают имена объектов при их открытии. Им не нужно предоставлять доступ.

Открытие именованных объектов

Именованные объекты открываются путем передачи имени соответствующему API Open:

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

GetAppContainerNamedObjectPath возвращает именованный путь к объекту для упакованного приложения на основе его SID. Идентификатор безопасности для упакованного приложения можно создать, передав имя семейства пакетов в функцию DeriveAppContainerSidFromAppContainerName.

Замечание

Имя семейства пакетов можно найти с помощью редактора манифеста пакета в Visual Studio во время разработки с помощью Центра партнеров для приложений, опубликованных в Microsoft Store, или с помощью команды Get-AppxPackage PowerShell для уже установленных приложений.

При открытии именованных объектов, созданных упакованным приложением, используйте формат <PATH>\<NAME>:

  • Замените <PATH> на именованный путь объекта создающего приложения.
  • Замените <NAME> именем объекта.

Замечание

Имена объектов, начинающиеся с <PATH>, требуются только в том случае, если объект был создан упакованным приложением. Именованные объекты, созданные приложениями Win32, не должны быть квалифицированы, хотя доступ по-прежнему должен предоставляться при создании объектов.

Замечания

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