Не смог установить ChatGPT из Microsoft Store — и написал для этого отдельную утилиту

Картинка для привлечения внимания
Картинка для привлечения внимания

Началось всё довольно банально: я не мог поставить ChatGPT из Microsoft Store из-за региона.

Гуглить очередную инструкцию со сменой настроек Windows было лень, поэтому я дал задачу нейронке: вот установщик, помоги поставить. В процессе выяснилось, что достаточно временно сменить регион Windows, запустить установку, а потом вернуть всё обратно.

Метод, конечно, не новый. Microsoft сама описывает смену страны или региона Windows как штатную процедуру. Но тогда возник довольно очевидный вопрос: если последовательность действий известная и полностью механическая, почему бы её просто не автоматизировать?

Так появился WinStoreRegion.

Первая идея была очень простой: запомнить текущий регион, временно сменить его, передать установку Microsoft Store и после начала установки вернуть исходное значение.

Но довольно быстро выяснилось, что даже здесь есть что улучшать.

Например, какой регион вообще выбирать? Можно просто поставить США и попробовать. Если не сработало — Германию, Великобританию или ещё что-нибудь. Но раз Store сам знает, где приложение доступно, логичнее спросить его.

Поэтому WinStoreRegion умеет определять, в каких регионах конкретное приложение доступно для установки. Пользователь передаёт ссылку Microsoft Store или Product ID, программа проверяет доступность и предлагает подходящий регион.

После этого регион Windows временно меняется, установка передаётся штатным механизмам Microsoft, а когда программа убеждается, что процесс действительно начался, исходный регион возвращается обратно.

То есть WinStoreRegion не скачивает какие-то перепакованные приложения с посторонних сайтов и не патчит Microsoft Store. Установкой по-прежнему занимается сама инфраструктура Microsoft.

В некоторых случаях обычный механизм Store не срабатывает. Тогда утилита может получить официальный установщик Microsoft по Product ID, проверить цифровую подпись и запустить его уже при временно изменённом регионе.

Отдельный вопрос возник с восстановлением настроек.

Если просто написать последовательность «сменить регион → поставить приложение → вернуть регион», остаётся неприятный сценарий: программа упала, Windows перезагрузилась или пользователь просто закрыл её в неподходящий момент. Регион после этого может остаться изменённым.

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

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

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

Здесь я пока специально не стал делать красивую кнопку «Обновить всё».

Оказалось, что номера версий пакетов Microsoft Store не всегда позволяют уверенно сказать, что один пакет действительно новее другого. winget тоже не во всех случаях даёт надёжный ответ. Поэтому сейчас WinStoreRegion показывает найденную информацию, но не делает вид, что умеет гарантированно обновлять всё одним нажатием.

Сам проект постепенно перестал быть одноразовым скриптом.

Я выбрал Rust. Для небольшой системной Windows-утилиты не хотелось тянуть Python с рантаймом, а C++ использовать просто потому, что «так исторически принято», тоже не было особого желания. Rust сейчас всё чаще используется для системных инструментов, поэтому заодно это оказался хороший повод применить его в нормальном Windows-проекте, а не в очередном учебном примере.

В результате получился один portable .exe размером примерно 1,3 МБ. Устанавливать сам WinStoreRegion не нужно, права администратора он не запрашивает.

Релизы собираются сразу для x64, ARM64 и 32-битного x86. При этом честно оговорюсь: полный реальный прогон пока делался только на x64. ARM64 и x86 собираются автоматически в CI, но подходящего физического железа для проверки у меня пока нет.

WinStoreRegion также ничего не делает с регионом учётной записи Microsoft, не меняет IP-адрес, не является VPN и не обещает обходить любые ограничения Store. Он всего лишь автоматизирует давно известный способ со временной сменой региона Windows и старается сделать его немного безопаснее и удобнее.

Проект полностью открытый и опубликован под GPL-3.0-or-later.

Сейчас вышла первая версия — 0.1.0. Исходники, сборки и история изменений лежат на GitHub:

Релиз:

Исполняемый файл пока не подписан платным сертификатом, поэтому SmartScreen при первом запуске ожидаемо предупреждает о неизвестном приложении. Для релизов публикуются SHA-256, а сами бинарники собираются через GitHub Actions.

Пока это скорее небольшой open-source инструмент, выросший из проблемы «не могу поставить одно приложение», чем попытка сделать какой-то большой продукт.

Но именно такие утилиты мне и нравятся: столкнулся с повторяемой ручной процедурой, автоматизировал её, а потом выяснилось, что вокруг первоначальной задачи есть ещё несколько вещей, которые тоже можно нормально решить.

Если сталкивались с региональными ограничениями Microsoft Store — интересно, как решали эту проблему раньше. А если попробуете WinStoreRegion, особенно на ARM64 или какой-нибудь нестандартной конфигурации Windows, обратная связь и issue на GitHub будут очень кстати.

1