Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Для получения информации о мотивациях добавления идентификатора пакета, а также различиях между созданием пакетов в Visual Studio и их созданием вручную, см. раздел "Обзор".
В этом разделе описывается, как создать и зарегистрировать пакет удостоверений вручную. Сведения о создании пакета идентификатора в Visual Studio см. в статье Присвоение идентификатора пакету путем упаковки с внешним расположением в Visual Studio.
Ниже приведены шаги (подробно описанные в этом разделе) для создания и регистрации пакета удостоверений вручную:
- Создайте манифест пакета для пакета идентификации
- Создание и подписание пакета удостоверений
- Добавьте метаданные удостоверения в манифесты настольных приложений
- Зарегистрируйте пакет удостоверений в установщике
- Необязательные шаги
Создайте манифест для пакета идентификации
Первым шагом к созданию пакета идентификации является создание манифеста пакета на основе приведенного ниже шаблона. Это манифест 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
Заполните атрибуты элемента сведениями о приложении-
Name
— требуемое имя пакета удостоверений -
Publisher
должен соответствоватьSubject
сертификату, используемому для подписывания приложения. -
Version
— это требуемая версия пакета удостоверений. Распространенная практика заключается в выравнивании версии пакета удостоверений с версией приложения. Вы не сможете зарегистрировать версию пакета удостоверений в системе, если эта версия пакета уже зарегистрирована. Сначала необходимо отменить регистрацию существующего пакета, чтобы переустановить пакет с той же версией. -
ProcessorArchitecture
должен бытьneutral
как указано, чтобы пакет идентификатора работал на всех архитектурах (x86, x64 и ARM64)
-
- Заполните элементы
DisplayName
иPublisherDisplayName
подробностями вашего приложения- Если в манифест помимо простого удостоверения не добавляются дополнительные функции, эти значения не отображаются нигде.
- Обновите элемент
Logo
на относительный путь в каталоге установки приложения, который должен ссылаться на изображение .png, .jpgили .jpeg. - Убедитесь, что элемент
AllowExternalContent
установлен наtrue
, как показано, для повторного использования вашего существующего установщика. - Установите
TargetDeviceFamily
MinVersion
иMaxVersionTested
как указано ниже.- Установите
MinVersion
значение10.0.19041.0
, как показано для максимального охвата и единообразия между версиями ОС Windows 10 и Windows 11 - Установите
MinVersion
, чтобы10.0.26100.0
ограничить пакет удостоверений только Windows 11 версии 24H2 и более поздних версий. - Установите
MaxVersionTested
в10.0.26100.0
, как показано - Примечание. Эта
AllowExternalContent
функция была представлена в сборке Windows 10.0.19041.0. Если ваше приложение работает на более ранних версиях ОС, чем указано, необходимо выполнить проверку версии ОС в установщике и не регистрировать пакет идентификации на версиях ОС, которые старше 10.0.19041.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 для примеров.
Добавление метаданных удостоверения в манифесты классического приложения
Вы подключаете пакет удостоверений к исполняемым файлам вашего приложения, включая манифесты приложения (известные также как параллельные или объединенные манифесты) с метаданными, соответствующими метаданным из манифеста пакета удостоверений.
В 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
элемента в манифесте пакета удостоверений.
Регистрация идентификационного пакета в установщике
Последним шагом для связывания удостоверения с приложением является регистрация пакета удостоверений в установщике и связывание его с каталогом установки приложения.
PowerShell
Выполнение powershell.exe с правильными параметрами — самый простой способ регистрации пакета. Рекомендации отличаются для установок на пользователя и на всю систему.
Per-User (PowerShell)
Чтобы зарегистрировать пакет идентификации во время персональной установки:
powershell.exe -NoLogo -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -Command "Add-AppxPackage -Path <PackagePath> -ExternalLocation <ExternalLocation>"
- Задайте
<PackagePath>
абсолютный путь к подписанному пакету удостоверений, создаваемому на предыдущем шаге (с именем файла). - Задайте
<ExternalLocation>
абсолютный путь к каталогу установки приложения (без имен исполняемых файлов).
Чтобы отменить регистрацию пакета идентификаций во время удаления пользователя:
powershell.exe -NoLogo -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -Command "Get-AppxPackage <PackageName> | Remove-AppxPackage"
- Задайте
<PackageName>
имя пакета, определенное в манифесте пакета удостоверений (атрибут Name элемента Identity )
Per-Machine (PowerShell)
Чтобы зарегистрировать пакет идентификации во время установки для всего компьютера:
powershell.exe -NoLogo -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -Command "Add-AppxPackage -Stage <PackagePath> -ExternalLocation <ExternalLocation>; Add-AppxProvisionedPackage -Online -PackagePath <PackagePath>"
- Задайте
<PackagePath>
абсолютный путь к подписанному пакету удостоверений, создаваемому на предыдущем шаге (с именем файла). - Задайте
<ExternalLocation>
абсолютный путь к каталогу установки приложения (без имен исполняемых файлов).
Чтобы отменить регистрацию пакета удостоверений во время удаления на уровне компьютера:
powershell.exe -NoLogo -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -Command "$packages = Get-AppxPackage <PackageName>; foreach ($package in $packages) { Remove-AppxProvisionedPackage -PackageName $package.PackageFullName -Online }; foreach ($package in $packages) { Remove-AppxPackage -Package $package.PackageFullName -AllUsers }
- Задайте
<PackageName>
имя пакета, определенное в манифесте пакета удостоверений (атрибут Name элемента Identity )
API-интерфейсы PackageManager
Если вы предпочитаете вызывать API ОС для регистрации и отмены регистрации пакета удостоверений, API PackageManager предоставляет эквивалентные функциональные возможности PowerShell. Рекомендации отличаются для установок на пользователя и на всю систему.
Ниже приведены фрагменты кода, демонстрирующие API. Готовый к работе код в C# и C++см. в разделе "Примеры приложений".
Per-User (PackageManager)
Приведенный ниже код демонстрирует регистрацию пакета удостоверений с помощью метода AddPackageByUriAsync и отмены регистрации пакета удостоверений с помощью метода RemovePackageAsync .
using Windows.Management.Deployment;
...
// Register the identity package during install
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);
...
// Unregister the identity package during uninstall
var packageManager = new PackageManager();
var packages = packageManager.FindPackagesForUserWithPackageTypes("", "<IdentityPackageFamilyName>", PackageType.Main);
foreach (var package in packages)
{
await packageManager.RemovePackageAsync(package.Id.FamilyName);
}
Обратите внимание на следующие важные сведения об этом коде:
- Задайте
externalLocation
абсолютный путь к каталогу установки приложения (без имен исполняемых файлов) - Задайте
packagePath
абсолютный путь к подписанному пакету удостоверений, создаваемому на предыдущем шаге (с именем файла) -
<IdentityPackageFamilyName>
можно найти, выполнив команду PowerShellGet-AppxPackage <IdentityPackageName>
на системе, где зарегистрирован пакет идентификации. СвойствоPackageFamilyName
содержит значение, используемое здесь.
Per-Machine (PackageManager)
Приведенный ниже код демонстрирует регистрацию пакета удостоверений с помощью методов StagePackageByUriAsync и ProvisionPackageForAllUsersAsync и отмены регистрации пакета удостоверений с помощью методов DeprovisionPackageForAllUsersAsync и RemovePackageAsync .
// Register the identity package during install
var externalUri = new Uri(externalLocation);
var packageUri = new Uri(packagePath);
var packageManager = new PackageManager();
var options = new StagePackageOptions();
options.ExternalLocationUri = externalUri;
await packageManager.StagePackageByUriAsync(packageUri, options);
await packageManager.ProvisionPackageForAllUsersAsync(packageFamilyName);
...
// Unregister the identity package during uninstall
var packageManager = new PackageManager();
var packages = packageManager.FindPackagesForUserWithPackageTypes("", "<IdentityPackageFamilyName>", PackageType.Main);
foreach (var package in packages)
{
await packageManager.DeprovisionPackageForAllUsersAsync(package.Id.FamilyName);
await packageManager.RemovePackageAsync(package.Id.FamilyName, RemovalOptions.RemoveForAllUsers);
}
Обратите внимание на следующие важные сведения об этом коде:
- Задайте
externalLocation
абсолютный путь к каталогу установки приложения (без имен исполняемых файлов) - Задайте
packagePath
абсолютный путь к подписанному пакету удостоверений, создаваемому на предыдущем шаге (с именем файла) - Его
<IdentityPackageFamilyName>
можно найти, выполнив команду в PowerShell в системе, где зарегистрирован пакет идентификации. СвойствоPackageFamilyName
содержит значение, используемое здесь.
Примеры приложений
Примеры PackageWithExternalLocation см. в полнофункциональных приложениях C# и C++, демонстрирующих регистрацию и отмену регистрации пакета удостоверений.
Другие необязательные шаги
Локализация и визуальные ресурсы
Некоторые функции, которые понимают идентификатор пакета, могут привести к строкам и изображениям, отображаемым в ОС Windows, из манифеста идентификатора пакета. Рассмотрим пример.
- Приложение, использующее API камеры, микрофона или расположения, будет иметь выделенный элемент управления в параметрах конфиденциальности Windows, а также запрос на согласие с брокером, который пользователи могут использовать для предоставления или запрета доступа к этим конфиденциальным ресурсам.
- Приложение, которое регистрирует цель для общего доступа, будет отображаться в диалоговом окне общего доступа.
Сведения о локализации строк в манифесте пакета удостоверений см. в разделе "Локализация манифеста".
При указании путей к изображениям в атрибутах VisualElements
в манифесте пакета удостоверений, указанные пути должны быть относительными путями в каталоге установки вашего приложения, которые разрешаются к изображениям типа .png, .jpgили .jpeg. Имена атрибутов указывают ожидаемые размеры изображений (150x150 и 40x40).
Windows developer