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


Присвоение идентичности пакета при помощи его упаковки с внешним местоположением

Многие функции Windows могут использоваться настольным приложением только в том случае, если это приложение имеет идентификатор пакета во время выполнения. См. функции , для которых требуется идентификация пакета. Если у вас есть настольное приложение с собственным установщиком, вам мало нужно изменить, чтобы воспользоваться идентификацией пакета.

Начиная с Windows 10 версии 2004, вы можете предоставить удостоверение пакета приложению, просто создав и зарегистрируя пакет с внешним расположением в приложении. Упаковка с внешним расположением позволяет зарегистрировать простой идентификационный пакет в вашем существующем установщике, не изменяя способ и место установки приложения. Если вы знакомы с полной упаковкой MSIX, это гораздо более легкий вариант веса, как описано ниже.

Чтобы создать и зарегистрировать пакет удостоверений, выполните следующие действия.

  1. Создайте манифест для пакета идентификации
  2. Создание и подписание пакета удостоверений
  3. Добавление метаданных удостоверения в манифесты классического приложения
  4. Зарегистрируйте пакет идентификаторов в установщике

Создайте манифест для пакета идентификации

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

<?xml version="1.0" encoding="utf-8"?>
<Package IgnorableNamespaces="uap uap10"
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities">
  <Identity Name="ContosoPhotoStore" Publisher="CN=Contoso" Version="1.0.0.0" ProcessorArchitecture="neutral" />
  <Properties>
    <DisplayName>Contoso PhotoStore</DisplayName>
    <PublisherDisplayName>Contoso</PublisherDisplayName>
    <Logo>Assets\storelogo.png</Logo>
    <uap10:AllowExternalContent>true</uap10:AllowExternalContent>
  </Properties>
  <Resources>
    <Resource Language="en-us" />
  </Resources>
  <Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.19041.0" MaxVersionTested="10.0.26100.0" />
  </Dependencies>
  <Capabilities>
    <rescap:Capability Name="runFullTrust" />
    <rescap:Capability Name="unvirtualizedResources"/>
  </Capabilities>
  <Applications>
    <Application Id="ContosoPhotoStore" Executable="ContosoPhotoStore.exe" uap10:TrustLevel="mediumIL" uap10:RuntimeBehavior="win32App"> 
      <uap:VisualElements AppListEntry="none" DisplayName="Contoso PhotoStore" Description="Contoso PhotoStore App" BackgroundColor="transparent" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" />
    </Application>
  </Applications>
</Package>

Обратите внимание на следующие важные сведения об этом манифесте:

  • Identity Заполните атрибуты элемента сведениями о приложении
    • Publisher должен соответствовать Subject сертификату, используемому для подписывания приложения.
  • Заполните элементы DisplayName и PublisherDisplayName подробностями вашего приложения
    • Если в манифест помимо простого удостоверения не добавляются дополнительные функции, эти значения не отображаются нигде.
  • Обновите элемент Logo на относительный путь в каталоге установки приложения, который должен ссылаться на изображение .png, .jpgили .jpeg.
  • Убедитесь, что элемент AllowExternalContent установлен на true, как показано, для повторного использования вашего существующего установщика.
  • Установите и MaxVersionTested выполните указанные ниже действияTargetDeviceFamilyMinVersion.
    • Установите MinVersion значение 10.0.19041.0 , как показано для максимальной доступности и единообразия в версиях ОС Windows 10 и Windows 11
    • Установите MinVersion для 10.0.26100.0 ограничения пакета удостоверений Windows 11 версии 24H2 и более поздних версий.
    • Установите MaxVersionTested в 10.0.26100.0, как показано
  • Убедитесь, что возможности runFullTrust и unvirtualizedResources объявлены так, как показано для совместимости с Win32.
  • Application Добавление элемента, как показано для каждого исполняемого файла, связанного с приложением
    • Убедитесь, что TrustLevel является mediumIL, а RuntimeBehavior является win32App, как показано для совместимости с Win32.
  • VisualElements Дочерний элемент является обязательным, но AppListEntry="none" атрибут гарантирует, что пакет удостоверений не отображается среди установленных приложений.
    • DisplayName Обновите и Description атрибуты с соответствующими сведениями и оставьте другие атрибуты, как показано (пути к указанному изображению не нужно разрешать).

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

Создание и подписание пакета удостоверений

После создания манифеста пакета удостоверений создайте пакет удостоверений с помощью средстваMakeAppx.exe в пакете SDK для Windows.

MakeAppx.exe pack /o /d <path to directory that contains manifest> /nv /p <output path>\MyPackage.msix

Примечание. Флаг /nv требуется для обхода проверки пути к файлам, на которые ссылается ссылка, в манифесте.

Для установки на компьютеры конечных пользователей пакет удостоверений должен быть подписан сертификатом, которому доверяют на целевом компьютере. Вы можете создать самозаверяющий сертификат для целей разработки и подписать пакет удостоверений с помощью SignTool, который доступен в пакете SDK для Windows, но рабочий сертификат из ИТ-отдела или службы, например доверенный подписывание Azure , потребуется для регистрации пакета на конечных компьютерах пользователей.

SignTool.exe sign /fd SHA256 /a /f <path to certificate>\MyCertificate.pfx /p <certificate password> <path to package with external location>\MyPackage.msix

Примечание. Сведения о том, как создавать и подписывать пакет удостоверений в конвейере CI/CD с помощью рабочих сертификатов, см. в разделе "Общие сведения о конвейере MSIX и CI/CD".

Добавление метаданных удостоверения в манифесты классического приложения

Пакет удостоверений подключается к исполняемым файлам приложения, включая манифесты приложений (манифесты параллельно или fusion) с метаданными, соответствующими метаданным из манифеста пакета удостоверений.

В Visual Studio можно добавить манифест приложения в исполняемый проект, открыв контекстное меню "Проект" и выбрав "Добавить>файл манифеста приложения новогоэлемента>".

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

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="0.0.0.0" name="ContosoPhotoStore"/>
  <msix xmlns="urn:schemas-microsoft-com:msix.v1"
          publisher="CN=Contoso"
          packageName="ContosoPhotoStore"
          applicationId="ContosoPhotoStore"
        />
</assembly>

Атрибуты msix элемента должны соответствовать этим значениям из манифеста пакета удостоверений:

  • Атрибуты packageName и publisher должны соответственно соответствовать атрибутам Name и Publisher в элементе Identity вашего манифеста пакета удостоверений.
  • Атрибут applicationId должен соответствовать атрибуту Id соответствующего Application элемента в манифесте пакета удостоверений.

Регистрация идентификационного пакета в установщике

Последним шагом для связывания удостоверения с приложением является регистрация пакета удостоверений в установщике и связывание его с каталогом установки приложения.

В приведенном PackageManager.AddPackageByUriAsync ниже фрагменте показано использование метода для регистрации пакета удостоверений.

using Windows.Management.Deployment;

...

var externalUri = new Uri(externalLocation);
var packageUri = new Uri(packagePath);

var packageManager = new PackageManager();

var options = new AddPackageOptions();
options.ExternalLocationUri = externalUri;

await packageManager.AddPackageByUriAsync(packageUri, options);

Обратите внимание на следующие важные сведения об этом коде:

  • Задайте externalLocation абсолютный путь к каталогу установки приложения (без имен исполняемых файлов)
  • Задайте packagePath абсолютный путь пакета удостоверений, созданный на предыдущем шаге (с именем файла)

Полный пример, включая отмену регистрации пакета при удалении, см. в разделе StartUp.cs.

Пример приложения

Ознакомьтесь с примером SparsePackages — это полностью рабочее тестовое приложение, демонстрирующее, как назначить идентичность пакета классическому приложению, зарегистрировав пакет идентичности.