Однажды в бот поддержки пришел человек с вопросом, почему при установке с файлом ответов у него часть интерфейса системы на английском языке. Однако из скриншота этого не следовало!
Эту проблему я сегодня использую для демонстрации приема, который полезно иметь в арсенале.
[+] Сегодня в программе
Проблема
На самом деле слева не системный интерфейс, а магазинное приложение "Безопасность Windows". Локализация интерфейса этих приложений определяется по первому языку в списке предпочитаемых языков. И он действительно был английским. После наводящих вопросов выяснилось, что выполнялась установка русской Windows 11.
Тут я вспомнил, как в обсуждении моего простого файла ответов читатель сетовал на ту же проблему – после установки первым в списке идет английский. Язык ОС он не сообщил, но предположим тоже русский.
В принципе, первым в списке предпочитаемых языков должен стоять язык дистрибутива.
Возможно, проблема возникает при каком-то сочетании региональных параметров файла ответов и языка дистрибутива. Кроме того, разработчики вносят изменения в языковые аспекты установки ОС. Про нововведения в 20H1 я рассказывал. А сейчас в документации DISM для параметра /set-uilang добавилось примечание. Начиная с Windows 11 заданный язык установки ОС не переопределяется пользователем при выборе языка на этапе OOBE (за исключением домашних изданий).
Таким образом, диагностика потребует перебрать множество вариантов, что займет кучу времени. Мы пойдем другим путем ©
Задача
Для всех пользователей форсировать определенный порядок списка предпочитаемых языков и язык ввода по умолчанию.
В формулировке кроются два нюанса:
- Только для первого пользователя это проще настроить чем для всех, чего точно захочется в итоге.
- Язык ввода по умолчанию опирается на тот же список языков. Дефолтная английская раскладка при русском интерфейсе – популярное предпочтение.
Решение
Практически любые региональные настройки можно задать с помощью PowerShell. Для обсуждаемых настроек предусмотрены командлеты Set-WinUserLanguageList и Set-WinDefaultInputMethodOverride.
Параметры только для первого пользователя
В общем случае настраивается так:
#список языков (русский первый) Set-WinUserLanguageList -LanguageList ru-RU, en-US -Force #английский метод ввода по умолчанию Set-WinDefaultInputMethodOverride -InputTip 0409:00000409
Эти команды можно выполнить из FirstLogonCommands файла ответов.
<RunSynchronous> <RunSynchronousCommand wcm:action="add"> <Path>powershell -noprofile -command Set-WinUserLanguageList -LanguageList ru-RU, en-US -Force</Path> <Order>15</Order> <Description>LangList</Description> </RunSynchronousCommand> <RunSynchronousCommand wcm:action="add"> <Path>powershell -noprofile -command Set-WinDefaultInputMethodOverride -InputTip "0409:00000409"</Path> <Order>20</Order> <Description>DefaultInputLang</Description> </RunSynchronousCommand> </RunSynchronous>
Команды отработают при первом входе в систему первого вошедшего пользователя, но и только.
Параметры для всех пользователей
Импорт в реестр настроек для всех пользователей я разбирал в статье Автоматическое внесение изменений в профиль Default во время установки Windows. В нашем случае список языков и предпочитаемый метод ввода тоже хранятся в реестре. Но не всегда реестр решает вопрос, поэтому я хочу показать другой прием.
Можно настроить однократное выполнение команд из раздела реестра RunOnce или Run!
Настройка пользовательских региональных параметров не требует прав администратора. Поэтому при первом входе каждого нового пользователя в систему можно однократно выполнить команды PowerShell из реестра. Формально способ RunOnce не поддерживается для обычного пользователя, но работает, что я разбирал в канале Telegram.
Алгоритм простой:
- В раздел реестра RunOnce или Run профиля Default прописываются команды.
- При первом входе каждого нового пользователя они выполняются и…
- У этого пользователя при использовании:
- RunOnce — команды удаляются автоматически
- Run — необходимо удалить их самостоятельно отдельной командой
В файле ответов импорт тех же команд PowerShell в раздел RunOnce выглядят так:
<RunSynchronous> <RunSynchronousCommand wcm:action="add"> <Path>reg load HKEY_USERS\Custom %systemdrive%\Users\Default\NTUSER.DAT</Path> <Order>10</Order> <Description>Load NTUSER.DAT</Description> </RunSynchronousCommand> <RunSynchronousCommand wcm:action="add"> <Path>reg add HKEY_USERS\Custom\Software\Microsoft\Windows\CurrentVersion\RunOnce /v LangList /t REG_SZ /d "powershell -noprofile -command Set-WinUserLanguageList -LanguageList ru-RU, en-US -Force" /f</Path> <Order>15</Order> <Description>LangList</Description> </RunSynchronousCommand> <RunSynchronousCommand wcm:action="add"> <Path>reg add HKEY_USERS\Custom\Software\Microsoft\Windows\CurrentVersion\RunOnce /v LangList /t REG_SZ /d "powershell -noprofile -command Set-WinDefaultInputMethodOverride -InputTip \"0409:00000409\"" /f</Path> <Order>20</Order> <Description>DefaultInputLang</Description> </RunSynchronousCommand> <RunSynchronousCommand wcm:action="add"> <Path>reg unload HKEY_USERS\Custom</Path> <Order>30</Order> <Description>Unload NTUSER.DAT</Description> </RunSynchronousCommand> </RunSynchronous>
Напомню, что эти команды должны выполняться на этапе specialize.
Бонус: настройка пользовательского профиля с помощью Active Setup
Есть еще один древний, но эффективный и в некоторых случаях необходимый способ — Active Setup! Я написал о нем в каналe Telegram.
Заключение
Конечно, ничего нового тут нет. Но даже очень древние способы могут быть эффективны в новой обертке. Более того, этот метод (за вычетом файла ответов) до сих пор использует Microsoft для установки клиента OneDrive даже в Windows 11. Там задействован раздел Run нежели RunOnce. Но очевидно установщик OneDrive в конце просто подчищает за собой команду в HKCU, которая его запускает.
Lecron
Спасибо. Интересный подход. Мне особенно нравится собирать все модификации в одном месте. Потом проще разбираться. RunOnce — самое то. Жаль, что построчное конфигурирование блоков RunSynchronousCommand выглядит некоторым нарушением инкапсуляции. Красиво если рассматриваем один кейс, всего из 2 команд. А если их много? В идеале, должна быть одна строка reg add …\RunOnce config_interface_language.sh
Vadim Sterkin
Спасибо. Можно все одной синхронной командой импортировать из файла. Я это показывал в смежной статье и сослался на нее https://www.outsidethebox.ms/21490/#991
Там был tweaks.reg с твиками реестра, в него можно добавить эти параметры RunOnce. Или делать отдельный runonce.reg с командами RunOnce. Вместо REG можно CMD, PowerShell — не суть.
То есть соль данного материала не импорт сам по себе, а импорт именно в RunOnce для однократного выполнения.