← Back to list

Як створити MSIX пакет для власної програми

В даній статті я покроково розкажу як створити найпростішу MSIX збірку від exe-шника до встановлення та запуску, без зайвих рухів та…

Oleksii Sylichenko · 2026-04-16 11:44 · 0 claps · 10.1 min read
#msix #microsoft-store #application-window
Open on Medium ↗

Як створити MSIX пакет для власної програми

В даній статті я покроково розкажу як створити найпростішу MSIX збірку від exe-шника до встановлення та запуску, без зайвих рухів та складнощів.

Отже, припустимо, у вас є exe-шник, який потрібно запакувати в MSIX.

Вам знадобляться дві речі:

  1. цифровий підпис для MSIX пакету. Самопідписаний, або виданий авторизованим центром сертифікації. Читайте більше:
  1. MSIX Packaging Tool: https://apps.microsoft.com/detail/9n5lw3jbcxkf

MSIX Packaging Tool

Припустимо, що сертифікат ви отримали і система йому довіряє, отже відкриваємо MSIX Packaging Tool:

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

Обираємо тип PFX, вказуємо файл та вводимо пароль.

Ви можете вказати адресу сервера мітки часу, наприклад, http://timestamp.digicert.com (офіційний сервер DigiCert, одного з найбільших центрів сертифікації) — для того, щоб підписаний MSIX пакет можна було використовувати навіть після закінчення дії сертифікату.

Але мітку часу необов’язково додавати до цифрового підпису, якщо ви збираєтеся публікувати свою програму в MS Store, тому що Store попросту замінить ваш підпис на власний.

Повертаємося до головного вікна.

Натискаємо “Application package”:

Next:

Почекайте доки автоматично виконаються всі необхідні “Additional preparations”, і коли все буде готово — можна продовжити.

Важливо:

  • відмітьте “Windows Search is active
  • натисніть “Disable selected

Щоб воно не створювало зайвих проблем.

Next:

Якщо ви завчасно ввели ці дані в налаштуваннях, то тут вони автоматично підтягнуться. Інакше — просто заповніть відповідні поля:

  • Оберіть “Sign with a certificate (.pfx)
  • Оберіть pfx-файл
  • Введіть пароль сертифікату
  • Time stamp server URL: “http://timestamp.digicert.com

Для чого потрібна мітка часу?

Для того, щоб підпис залишався дійсним навіть після закінчення терміну дії сертифіката.

Сервер міток часу:

  • незалежно підтверджує час підпису;
  • додає криптографічно захищений timestamp у підпис.

Як це працює:

  • Якщо сертифікат чинний зараз, то і цифровий підпис чинний.
  • Якщо строк дії сертифікату закінчився, то перевірити чи був він дійсним на момент підпису — можна лише за криптографічно захищеною міткою часу.

Але мітку часу необов’язково додавати до цифрового підпису, якщо ви збираєтеся публікувати свою програму в MS Store, тому що Store все одно замінить ваш підпис на власний.

Цей етап взагалі можна пропустити, нічого не заповнюючи, якщо вам просто треба створити непідписаний MSIX-пакет, а підписувати ви його будете окремо, пізніше.

⚠️ Важливо зазначити, що MSIX пакет без цифрового підпису Windows не дасть встановити.

Next:

Тут важливо правильно заповнити поля, вказавши інформацію з вашого MS Partner Center:

Введіть мета-інформацію вашої збірки:

  • Package name = Package/Identity/Name: зазвичай це ваше повне ім’я (або назва компанії) та назва проєкту через крапку, без пробілів та спецсимволів. Це ім’я має бути унікальним по всьому світу.
  • Package display name: можна ввести будь-яке значення, воно буде показуватись користувачам в MS Store.
  • Publisher name = Package/Identity/Publisher: якщо на попередньому етапі ви вказали сертифікат, то це поле автоматично заповниться з нього. Впевніться, що значення таке саме як в Partner Center.
  • **Publisher display name = Package/Properties/PublisherDisplayName:** ім’я власника, яке буде бачити користувач. Ваше повне ім’я, або назва компанії.
  • Version: версія збірки у форматі “Major.Minor.Build.Revision”, де ви можете вказати три старші номери. Revision оновлюється тоді, коли зміни мінімальні (патчі) або коли потрібно просто згенерувати новий унікальний білд для тестування без зміни основної версії продукту. Найчастіше це робить автоматизований скрипт збірки. MS Store може його ігнорувати.

Поки цього достатньо, тиснемо Next:

Next:

Тут зазвичай треба виконувати власноруч інсталяційні дії, які зараз відслідковуються, наприклад, скопіювати файли, зробити запис в реєстр, тощо.

Однак, ми просто пропустимо цей крок й зробимо інакше, для більшого контролю.

⚠️ На цьому етапі важливо нічого зайвого не запускати, не копіювати файли і т.п., бо всі ці дії, навіть фонові копіювання файлів чи оновлення програм можуть бути записані в пакет.

При звичайному створенні пакета, на цьому етапі вам потрібно запустити “встановлену програму”, і в цьому вікні має з’явитися головний (або усі запущені) процес. Якщо система не розпізнала встановлення, або не побачила запущеного процесу, то список може залишитися пустим. Іноді, кнопка “Browse…” допомагає спіймати ваш процес.

В нашому випадку, ми ще нічого не інсталювали, а отже і запускати нічого. Всі ці моменти ми вирішимо за допомогою маніфесту, а зараз — просто Next.

Yes, move on

Next

І фінальне вікно перед створенням пакету.

Технічно, зараз можна натиснути “Create”, буде створено порожній MSIX, який потім можна відредагувати, але щоб не робити зайвих рухів — відредагуємо його одразу перед створенням.

Натисніть “Package editor”.

Package editor: Файли та Маніфест

В цьому вікні нас цікавить два пункти:

  • Package information
  • Package files

Package files

Почнемо з файлів.

Дефолтний “порожній” пакет виглядає так:

Використовуючи контекстне меню, ви можете змінювати вміст пакету:

Тож додайте до нього:

  1. exe в корінь, або створіть для нього теку
  2. іконки в теку “Assets”:
  • Square44x44Logo (для списку додатків, тулбара).
  • Square150x150Logo (для плиток у меню “Пуск”).
  • StoreLogo (для Microsoft Store, розмір 256x256).

Важливо розуміти, що вміст пакета буде розпакований у відповідну теку в “C:\Program Files\WindowsApps\” — “Publisher.PackageName_Version_Arch__PublisherHash”, наприклад:

C:\Program Files\WindowsApps\OleksiiSylichenko.JustAnotherApp_1.0.0.0_x64__1234567890123\

Тому без необхідності, додаткові вкладені теки можна не створювати.

Отже, запакуємо наш exe та іконки:

Package information. Маніфест

Відкрийте розділ “Package information”.

Прокрутіть сторінку до самого низу та натисніть кнопку “Open file” в секції “Manifest file”:

В блокноті відкриється текст файлу маніфеста. Якщо ви все робили як зазначено в статті, то він матиме наступний вигляд (оригінальне форматування збережено):

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap10 rescap">
  <!--Package created by MSIX Packaging Tool version: 1.2024.405.0-->
  <Identity Name="OleksiiSylichenko.JustAnotherApp" Publisher="CN=01234567-0123-0123-0123-0123456789AB" Version="1.0.0.0" ProcessorArchitecture="x64" />
  <Properties>
    <DisplayName>Just Another Application</DisplayName>
    <PublisherDisplayName>Oleksii Sylichenko</PublisherDisplayName>
    <Description>None</Description>
    <Logo>Assets\StoreLogo.png</Logo>
    <uap10:PackageIntegrity>
      <uap10:Content Enforcement="on" />
    </uap10:PackageIntegrity>
  </Properties>
  <Resources>
    <Resource Language="en-us" />
  </Resources>
  <Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.22000.1" />
  </Dependencies>
  <Capabilities>
    <rescap:Capability Name="runFullTrust" />
  </Capabilities>
</Package>

Що нам потрібно буде змінити:

  • namespace’и
  • перевірити діапазон версій та пристроїв, на яких ваша програма повинна запускатися
  • при бажанні вказати мови
  • головне — додати секцію запуску головного exe-шника
  • при бажанні — вказати автозапуск при старті Windows

Namespaces

<Package 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"
         xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
         IgnorableNamespaces="uap uap10 rescap desktop">

Як використав наступні namespace’и:

  • uap — для іконок
  • uap10 — для додаткового захисту
  • rescap — для Win32-дозволів
  • desktop — для автозапуску разом з Windows

Щоб вони не підсвічувалися червоним в PyCharm — додаємо їх до ігнору:

Properties / PackageIntegrity

По-дефолту маніфест має інструкції щодо додаткового захисту:

<Package
    xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10" 
    IgnorableNamespaces="uap10">

<Properties>

    <uap10:PackageIntegrity>
        <uap10:Content Enforcement="on" />
    </uap10:PackageIntegrity>

Ця опція дозволяє Windows перевіряти цілісність файлів при кожному запуску. Якщо файл пошкоджено — система його відновить.

Важливий момент — PackageIntegrity не захищає файли від антивірусу, якщо той вирішить, що в них завелися шкідники — він зможе робити з ними що захоче. Наприклад, False Positive спрацювання може запросто видалити ваш exe-шник.

Діапазон версій та пристроїв

<Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop"
                        MinVersion="10.0.17763.0"
                        MaxVersionTested="10.0.22621.0"/>
</Dependencies>

Мови

<Resources>
    <Resource Language="uk-UA"/>
    <Resource Language="en-US"/>
</Resources>

Секція <Resources> повідомляє операційній системі та Microsoft Store, які мови офіційно підтримує ваша програма.

Запуск exe-шника

<Applications>
    <Application Id="App" 
                 Executable="JustAnotherApp.exe" 
                 EntryPoint="Windows.FullTrustApplication">
        <uap:VisualElements DisplayName="My Application" 
                            Description="Це моя програма з MSIX пакету"
                            BackgroundColor="transparent" 
                            Square150x150Logo="Assets\Square150x150Logo.png"
                            Square44x44Logo="Assets\Square44x44Logo.png">
        </uap:VisualElements>
    </Application>
</Applications>

Секція **<Applications>** — це "пусковий майданчик" вашого пакета, де ви описуєте всі виконувані компоненти програми. Саме тут Windows дізнається, який саме .exe файл потрібно запустити, які іконки та назву показувати користувачеві в меню «Пуск», а також які дозволи та візуальні стилі застосувати до інтерфейсу. Хоча весь пакет MSIX — це єдина сукупність файлів, секція <Applications> дозволяє системі бачити всередині одну або навіть декілька окремих програм з власними ідентифікаторами.

Тут важливий момент — Executable, в якому потрібно вказати правильний шлях до вашого exe-шника від кореня пакета.

  • DisplayName буде відображатися в списку встановлених програм
  • Square150x150Logo для плиток у меню “Пуск”
  • Square44x44Logo для списку додатків, панелі завдань

Автозавантаження з Windows

Для того, щоб ваша програма запускалася разом з Windows треба об’явити desktop**-namespace і додати в “Applications / Application / Extensions” розширення “windows.startupTask**”, вказавши стан запуску за замовчуванням:

<Package
         xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
         IgnorableNamespaces="... desktop">

<Applications>
    <Application ...>

        <Extensions>
            <desktop:Extension Category="windows.startupTask">
                <desktop:StartupTask TaskId="MyAppStartupTask" Enabled="true"/>
            </desktop:Extension>
        </Extensions>

Capabilities: runFullTrust

runFullTrust необхідно декларувати для звичайних Win32-застосунків, на відміну від UWP-застосунка, інакше Windows просто відмовить у запуску:

<Capabilities>
    <rescap:Capability Name="runFullTrust" />
</Capabilities>

AppxManifest.xml

Приклад повного тексту маніфесту:

<?xml version='1.0' encoding='UTF-8'?>
<Package 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"
         xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
         IgnorableNamespaces="uap uap10 rescap desktop">

    <Identity Name="OleksiiSylichenko.JustAnotherApp"
              Publisher="CN=01234567-0123-0123-0123-0123456789AB"
              Version="1.0.0.0"
              ProcessorArchitecture="x64"/>

    <Properties>
        <DisplayName>Just Another Application</DisplayName>
        <PublisherDisplayName>Oleksii Sylichenko</PublisherDisplayName>
        <Logo>Assets\StoreLogo.png</Logo>
        <uap10:PackageIntegrity>
            <uap10:Content Enforcement="on" />
        </uap10:PackageIntegrity>
    </Properties>

    <Dependencies>
        <TargetDeviceFamily Name="Windows.Desktop"
                            MinVersion="10.0.17763.0"
                            MaxVersionTested="10.0.22621.0"/>
    </Dependencies>

    <Resources>
        <Resource Language="uk-UA"/>
        <Resource Language="en-US"/>
    </Resources>

    <Applications>
        <Application Id="App" Executable="JustAnotherApp.exe" EntryPoint="Windows.FullTrustApplication">

            <uap:VisualElements DisplayName="My Application" 
                                Description="Це моя програма з MSIX пакету"
                                BackgroundColor="transparent" 
                                Square150x150Logo="Assets\Square150x150Logo.png"
                                Square44x44Logo="Assets\Square44x44Logo.png"/>

            <Extensions>
                <desktop:Extension Category="windows.startupTask">
                    <desktop:StartupTask TaskId="MyAppStartup" Enabled="true"/>
                </desktop:Extension>
            </Extensions>

        </Application>
    </Applications>

    <Capabilities>
        <rescap:Capability Name="runFullTrust"/>
    </Capabilities>
</Package>

Create msix-file

Коли закінчили з усіма налаштуваннями — натискаємо “Create”, і програма запропонує зберегти msix-файл:

Повне технічне ім’я MSIX-пакета (так званий Package Full Name) — це унікальний рядок, який Windows використовує для ідентифікації програми в системі. Він автоматично збирається з п’яти основних частин, визначених у маніфесті.

Ось ці складові:

  1. Package Name (Ім’я пакета)
  2. Version (Версія)
  3. Architecture (Архітектура): Архітектура процесора для якого зібрано пакет пакет (x64, x86, arm64 або neutral).
  4. ResourceId (ID ресурсу): Додатковий ідентифікатор, який зазвичай використовується для мовних пакетів або окремих масштабів іконок (часто залишається порожнім або ~).
  5. Publisher Hash (Хеш видавця): Унікальний 13-символьний ідентифікатор, який генерується на основі вашого Publisher ID (того самого CN=... із сертифіката). Це гарантує, що ніхто інший не зможе підмінити вашу програму своєю з такою ж назвою.

Інсталяція MSIX-пакету

Отже, якщо все добре, при запуску msix-файли ви побачите наступне вікно:

І по завершенні інсталяції ваша програма має запуститися:

А також відображатися в списку встановлених програм:

Якщо ви вказали в маніфесті автозавантаження разом з Windows:

Скрипт автоматизованої збірки

MSIX пакет можна створити автоматизовано за допомогою скрипта.

Для цього вам знадобляться компоненти Windows SDK:

  • MakeAppx.exe (C:\Program Files (x86)\Windows Kits\10\App Certification Kit\MakeAppx.exe) — для створення власне msix-файлу
  • signtool.exe (C:\Program Files (x86)\Windows Kits\10\App Certification Kit\signtool.exe) — для підписання пакета

Створити MSIX-пакет

MakeAppx.exe
  pack 
  /o 
  /d "./build/pack_dir" 
  /p "./dist/PackageAppName_Version_Arc__PublisherHash.msix"

Що означає:

  • pack — створити пакет
  • /o — overwrite (перезаписати, якщо файл уже існує)
  • /d "./build/pack_dir" —тека з підготовленим вмістом пакета
  • /p "./dist/...msix" — шлях до вихідного .msix файлу

Наприклад:

"C:\Program Files (x86)\Windows Kits\10\App Certification Kit\MakeAppx.exe" ^
  pack ^
  /o ^
  /d ".\build\Publisher.App" ^
  /p ".\dist\Publisher.App_1.0.0.0_x64__qwertyuiopasd.msix"

Мінімальний набір pack_dir:

  • AppxManifest.xml
  • файли застосунку (exe, dll, ресурси)
  • Assets (іконки, splash і т.д., якщо вказані в маніфесті)

Наприклад, “build\Publisher.App”:

  • Assets/Square44x44Logo.png
  • Assets/Square150x150Logo.png
  • Assets/StoreLogo.png
  • AppxManifest.xml
  • JustAnotherApp.exe

Як згенерувати Publisher Hash:

Підписати MSIX-пакет

Для підписання використовуємо signtool.exe:

signtool.exe
  sign 
  /fd SHA256 
  /f cert_path_str 
  /p cert_password 
  /tr SIGN_TIMESTAMP_URL 
  /td SHA256 
  msix_path_str

Що тут відбувається:

  • sign — режим підпису файлу
  • /fd SHA256 — алгоритм хешування файлу (digest)
  • /f cert_path_str — шлях до сертифіката (.pfx)
  • /p cert_password — пароль до сертифіката
  • /tr SIGN_TIMESTAMP_URL — URL сервера таймстампу (RFC 3161)
  • /td SHA256 — алгоритм для таймстампу
  • msix_path_str — файл, який підписуєш

Наприклад:

"C:\Program Files (x86)\Windows Kits\10\App Certification Kit\signtool.exe" ^
  sign ^
  /fd SHA256 ^
  /f "C:\cert\Publisher.pfx" ^
  /p "password123" ^
  /tr http://timestamp.digicert.com ^
  /td SHA256 ^
  ".\dist\Publisher.App_1.0.0.0_x64__qwertyuiopasd.msix"

Troubleshooting

Видалення бракованого пакета

Якщо щось пішло не так, наприклад, пакет встановився, але ваша програма не запускається, а інсталяція не відображається в списку “Програми та функції”, то видалити поламаний пакет можна двома шляхами:

  • хардкор — через PowerShell
  • лайтовий шлях з GUI — через безкоштовну програму з MS Store — **MSIX Hero**, від стороннього розробника:

MSIX Hero

MSIX Hero

Не вдалося перевірити сертифікат … (0x800B010A)

Якщо файл не було підписано, або сертифікат не є довіреним — ви отримаєте повідомлення про помилку:

Якщо msix-файл підписано, можна інсталювати сертифікат прямо з нього. Для цього відкрийте властивості файла:

Що робити далі — читайте в статті “Встановлення самопідписаного pfx-сертифікату”, в цьому процесі є важливі нюанси.

Чи встановлено сертифікат можна перевірити програмою, що викликається командою: “certlm.msc”:

Додатково

Цифровий підпис опублікованого пакета

  1. Microsoft бере ваш цифровий підпис, яким ви підписали пакет,
  2. підписує його своїм підписом з позначкою часу підпису
  3. перепідписує пакет вашим підписом, підписаним Microsoft

Відео

[embed]

Зовнішні посилання


메타데이터
post_id
f312e63aea61
slug
як-створити-msix-пакет-для-власної-програми-f312e63aea61
url
https://medium.com/@asilichenko/%D1%8F%D0%BA-%D1%81%D1%82%D0%B2%D0%BE%D1%80%D0%B8%D1%82%D0%B8-msix-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82-%D0%B4%D0%BB%D1%8F-%D0%B2%D0%BB%D0%B0%D1%81%D0%BD%D0%BE%D1%97-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%B8-f312e63aea61
canonical_url
https://medium.com/@asilichenko/%D1%8F%D0%BA-%D1%81%D1%82%D0%B2%D0%BE%D1%80%D0%B8%D1%82%D0%B8-msix-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82-%D0%B4%D0%BB%D1%8F-%D0%B2%D0%BB%D0%B0%D1%81%D0%BD%D0%BE%D1%97-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%B8-f312e63aea61
author_url
https://medium.com/@asilichenko
status
ok
fetched_at
2026-07-16 00:14:14