Windows 10 IoT Enterprise 2019 - режим мультикіоску

Запровадження

Windows 10 IoT Enterprise 2019 - маркетингове найменування чергового випуску Windows 10. Вихід цієї версії був оголошений у вересні 2018 року, відповідно має версію 1809, 18 - рік, 09 - місяць. За новим випуском Windows 10 1809 написано багато статей, але більшість із них присвячена різним «бантикам», «красиві» та різному функціоналу, який затребуваний у домашніх умовах.
У цій статті йтиметься лише про функціонал, який може бути затребуваний серед виробників пристроїв фіксованого призначення. А саме про нові можливості режиму "Кіоск". Також буде порушено тему зміни найменувань схем обслуговування редакцій Windows корпоративного сегменту.

Стара схема обслуговування з новою назвою

Почну з невеликого пояснення, у корпоративному сегменті редакцій Windows є дві схеми обслуговування, якими Windows отримує оновлення. Схеми обслуговування мають буквене позначення. Зараз гілки обслуговування називаються LTSC та SAC.

LTSC – означає Канал довгострокового обслуговування (З довгостроковим обслуговуванням). Раніше такий канал називався LTSB – Long Term Servicing Branch, Майкрософт просто змінив назву каналу обслуговування, саме обслуговування залишилося тим самим.

Також Microsoft змінив назву гілки обслуговування CBB – Current Branch for Business, тепер ця гілка обслуговування називається SAC – Піврічний канал. Знову ж таки змінилася лише назва.

Але слід згадати, що для гілок обслуговування LTSC та SAC використовуються різні дистрибутиви Windows.

Трохи про новий режим кіоску в SAC

Як я вже казав, LTSC і SAC мають різні дистрибутиви. У LTSC немає стандартних універсальних додатків та магазину додатків, а у SAC є. Відповідно, у LTSC немає браузера Edge, а він SAC є. Якщо при налаштуванні кіоску вибрати браузер Edge, тепер доступи два режими:

  1. Як цифровий знак або інтерактивний дисплей
  2. Як загальнодоступний браузер

Не зупинятимуся на налаштуванні даних режимів, т.к. Налаштування дуже просте і виконується в графічному інтерфейсі. Просто створіть користувача, який не є групою «Адміністратори», увімкніть для нього режим кіоску з використанням EDGE і подивіться на роботу даних режимів.

Кіоск з безліччю додатків

Дехто вважає, що ліцензійне використання Windows 10 IoT Enterprise має на увазі роботу тільки однієї програми на пристрої, насправді це не так. Пристрій повинен бути призначений для виконання одного бізнес-завдання і користувач не повинен мати доступ до робочого столу. Тепер Майкрософт сам дав інструмент для використання багатьох програм. Даний режим називається multi-app kiosk, далі для стислості я називатиму його мультикіоск. У цій статті ми розглянемо налаштування цього режиму за допомогою пакета забезпечення та деякі особливості цього режиму.

Небагато про режим «Мультикиоск»

При вході в обліковий запис користувача, для якого налаштовано режим мультикіоска, система буде працювати в режимі планшета. Меню «Пуск» буде розгорнуто на весь екран, де відображатимуться плитки програм.

Перелік основних налаштувань та можливостей режиму:

  1. Налаштування для багатьох користувачів або груп
  2. Для кожного користувача або групи можна призначити індивідуальні налаштування.
  3. Можливість використання універсальних та класичних додатків
  4. Можливість автоматичного запуску однієї із програм при вході користувача в систему
  5. Робота додатків за білим списком
  6. Доступ до папок за білим списком

Варто звернути увагу на пункт 5. За замовчуванням буде дозволено роботу лише додатків, які необхідні для роботи системи, інші додатки потрібно додати до списку дозволених. Тобто. тепер не потрібно окремо налаштовувати AppLocker. До речі, щоб уникнути конфлікту налаштувань AppLocker'а, у режимі мультикіоска всі налаштовані правила AppLocker'а не діятимуть.

У пункті 6 позначено хорошу можливість, але на даний момент можна надати дозвіл на запис тільки для папки «Downloads». Режим дозволяє використовувати універсальні та класичні програми. Усі параметри режиму вказуються в XML-файлі, в якому також можна вказати налаштування для кіоску з одним додатком.

А тепер спробуємо все це налаштувати.

Що нам знадобиться…

  1. Насамперед нам знадобиться сама система, яка підтримує режим мультикіоску. Тут можна завантажити демонстраційну версію
  2. Інструкція з налаштування мультикіоску
  3. Будь-який XML редактор
  4. Для застосування налаштувань мульткіоску:
    1. Для методу №1 — ICD, що входить до складу ADK. ADK можна завантажити тут
    2. Для методу №2 – утиліта PsExec. Утиліту можна завантажити тут

Він сказав - "Поїхали!"

Всі досліди я проводитиму на Windows 10 IoT Enterprise 1809 LTSC x32 комерційну версію, а не демонстраційну. Система без активації т.к. відсутність активації не позначається на функціоналі системи. Я взяв 32 біти тільки тому, що вона займає менше місця і працювати з образами системи буде швидше.

Крок 1 – встановлення

Установка Win 10 IoT Enterprise нічим не відрізняється від установки Win 10 Enterprise, тому весь процес установки не описуватиму, скажу лише про деякі нюанси.

Про всяк випадок нагадаю, не ставте систему поверх встановленої. Коли установник запитає про місце встановлення системи, видаліть усі розділи на майбутньому системному диску та вкажіть нерозмічений диск.

Ставимо систему без підключення до Інтернету, щоб система не підтягнула нічого зайвого.

Т.к. ми створюватимемо резервні образи системи і для цього її запечатуватимемо в режимі аудиту, то можна заощадити трохи часу завантаживши систему в режимі аудиту відразу після встановлення. Для цього, коли система у Вас попросить вибрати регіон Let's start with region. Is this right» просто натисніть «Ctrl+Shift+F3».

Крок 2 – створюємо образ системи

Т.к. ми знущатимемося над системою пробувати різні нові налаштування, то не виключено, що щось піде не так і потрібно буде повернути систему у вихідний стан. А для швидкого повернення у вихідний стан необхідно створити образ системи. Єдине, що я зроблю, це скопіюю «джентльменський набір» – скрипт і файл відповідей. Усі файли у мене знаходяться на папці «Sysprep», яку я скопіюю в корінь системного диска. І звичайно, я поділюся з Вами даним «джентльменським набором».

Sysprep.bat – для запечатування системи.

@echo off
chcp 1251>nul

net session>nul 2>nul
if %errorLevel% neq 0 (powershell -command "Start-Process "%~s0" -Verb RunAs"&exit)

tasklist /fi "ImageName eq sysprep.exe" | find /i "sysprep.exe"
if %errorlevel% lss 1 (taskkill /im sysprep.exe)

set AdminName=Admin
net user %AdminName%>nul 2>nul
if %errorLevel% neq 0 (call :AddAdmin "%AdminName%")
if %errorLevel% neq 0 (call :ShowMessage "‡‡‡Ошибка создания новой учетной записи администратора "%AdminName%"‡‡Нажмите любую клавишу для завершения работы скрипта"&pause>nul&exit)

pushd "%~dp0"

cls
call :ShowMessage ‡‡‡‡‡‡‡‡‡‡
echo  1 - Запечатать систему в режиме аудита
echo  2 - Запечатать систему в режиме приветствия
:Select
set /p Choice="Введите номер пункта меню: "
if "%Choice%"=="1" (goto Audit)
if "%Choice%"=="2" (goto OOBE)
echo.&echo Выбрано недопустимое значение.&goto Select

exit

:Audit
    call :ShowMessage "‡‡‡‡‡Запечатывание системы в режиме аудита"
    reg add HKLMSoftwareMicrosoftWindowsCurrentVersionRun /v KillSysprep /t REG_SZ /d "taskkill /im sysprep.exe" /f
    %SYSTEMROOT%System32Sysprepsysprep.exe /audit /generalize /shutdown /quiet
goto :eof

:OOBE
    call :ShowMessage "‡‡‡‡‡Запечатывание системы в режиме приветствия"
    reg delete HKLMSoftwareMicrosoftWindowsCurrentVersionRun /v KillSysprep /f
    powershell -command "(Get-Content -path 'Unattend.xml' -Raw).Trim() -replace 'Architecture=""".+?"""','Architecture="""%PROCESSOR_ARCHITECTURE%"""' | Set-Content -path 'Unattend.xml'"
    %SYSTEMROOT%System32Sysprepsysprep.exe /oobe /generalize /shutdown /quiet /unattend:Unattend.xml
goto :eof

:AddAdmin
    setlocal
    set UserName=%~1
    if not defined UserName (echo Не указано имя пользователя&endlocal&exit /b 1)

    call :GetGroupName "S-1-5-32-544" AdminGroup
    if not defined AdminGroup (endlocal&exit /b 2)

    call :GetGroupName "S-1-5-32-545" UserGroup
    if not defined UserGroup (endlocal&exit /b 3)

    net user %UserName% /add
    wmic useraccount where "Name='%UserName%'" set PasswordExpires=False>nul
    net localgroup %AdminGroup% %UserName% /add
    net localgroup %UserGroup% %UserName% /delete
    endlocal&exit /b 0
goto :eof

:GetGroupName
    if "%~1"=="" (echo Не указан SID группы&goto :eof)
    set %2=
    for /f "tokens=2 delims= " %%i in ('whoami /groups /fo table^|find "%~1"') do set %2=%%i
    if not defined %2 (echo Ошибка определения имени группы по SID'у "%~1")
goto :eof

:ShowMessage
    setlocal enabledelayedexpansion
    set String=%~1
    if not defined String (echo.&setlocal disabledelayedexpansion&goto :eof)
    set /a ConCols=120 & set /a Num=1
    set "String[!Num!].str=%String:‡=" & set /a Num+=1 & set "String[!Num!].str=%"
    for /l %%a in (1,1,%Num%) do (
        for /l %%b in (0,1,%ConCols%) do if "!String[%%a].str:~%%b!" == "" (set "String[%%a].str= !String[%%a].str! "&set /a String[%%a].len-=1) else (set /a String[%%a].len+=0||set /a String[%%a].len=0)
        if not defined String[%%a].str (set String[%%a].str= )
        if not !String[%%a].len! equ 0 (call set String[%%a].str=%%String[%%a].str:~,!String[%%a].len!%%)
        if "!String[%%a].str: =!"=="" (echo.) else (echo !String[%%a].str!))
    setlocal disabledelayedexpansion
goto :eof

При запуску скрипт перевірятиме наявність облікового запису «Admin» і створюватиме його за її відсутності. Обліковий запис буде додано до групи «Адміністратори».

Unattend.xml – файл відповідей для sysprep'а.

<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="specialize">
        <component name="Microsoft-Windows-Deployment" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <RunSynchronous>
                <RunSynchronousCommand wcm:action="add">
                    <Path>reg add HKLMSoftwareMicrosoftWindowsCurrentVersionSetupOOBE /v SetupDisplayedProductKey /t REG_DWORD /d 1 /f</Path>
                    <Order>1</Order>
                    <Description>Dont show key page</Description>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Path>reg add HKLMSoftwareMicrosoftWindowsCurrentVersionSetupOOBE /v UnattendCreatedUser /t REG_DWORD /d 1 /f</Path>
                    <Order>2</Order>
                    <Description>Dont make account</Description>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Path>cmd.exe /c rd %systemdrive%Sysprep /s /q</Path>
                    <Order>3</Order>
                    <Description>Del Folder</Description>
                </RunSynchronousCommand>
            </RunSynchronous>
        </component>
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <AutoLogon>
                <Enabled>true</Enabled>
                <Username>Admin</Username>
            </AutoLogon>
        </component>
    </settings>
    <settings pass="oobeSystem">
        <component name="Microsoft-Windows-International-Core" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <InputLocale>en-US; ru-RU</InputLocale>
            <SystemLocale>ru-RU</SystemLocale>
            <UILanguage>ru-RU</UILanguage>
            <UILanguageFallback></UILanguageFallback>
            <UserLocale>ru-RU</UserLocale>
        </component>
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <OOBE>
                <HideEULAPage>true</HideEULAPage>
                <HideLocalAccountScreen>true</HideLocalAccountScreen>
                <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
                <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
                <ProtectYourPC>1</ProtectYourPC>
            </OOBE>
        </component>
    </settings>
</unattend>

При запечатуванні в режимі аудиту скрипт додаватиме до реєстру команду на завершення процесу «sysprep.exe», щоб не закрити вікно sysprep'у щоразу вручну. При запечатуванні в режимі привітання скрипт вилучить з реєстру команду для закриття вікна і змінить значення архітектури у файлі відповідей на поточну. У файлі відповідей містяться параметри для завантаження системи без участі користувача та команда для видалення папки Sysprep в корені системного диска.

Тепер я запечатаю систему в режимі аудиту за допомогою Sysprep.bat і зніму образ системи. Зніматиму образ системи я буду за допомогою DISM'а і зніматиму образ лише системного тома. Якщо Ви зніматимете образ лише системного тома, а не всього диска, то не забувайте копіювати вміст каталогу WindowsSystem32Recovery на перший том в папку RecoveryWindowsRE після розгортання системи. Це необхідно зробити до завантаження ОС т.к. після завантаження ОС каталог WindowsSystem32Recovery вже буде порожнім.

Крок 3 – русифікація системи

Мовний пакет можна встановити без підключення до Інтернету, якщо цей пакет маєте. Якщо ні, система сама його завантажить з інтернету, коли Ви додасте мову в налаштуваннях. Тільки не потрібно брати мовний пакет з попередніх версій ОС. Для Windows 10 1809 має бути мовний пакет для Windows 10 1809.

Майкрософт слідує своєму плану – поступовому переведенню налаштувань із класичного меню в нове, тому в класичній панелі керування Ви вже не знайдете налаштувань для зміни мови та встановлення мовного пакета. Дані настройки тепер лише у параметрах системи.

У режимі аудиту Ви можете зіткнутися з проблемою відкриття параметрів системи з меню "Пуск", для відкриття параметрів системи виконайте команду - "ms-settings:", зверніть увагу на двокрапку в кінці команди, без нього команда не працюватиме. Після одноразового відкриття параметрів системи за допомогою цієї команди його можна буде відкривати за допомогою графічного меню.

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

Не описуватиму процес локалізації системи т.к. це суттєво ускладнить статтю, тим більше що процес локалізації докладно описаний тут. Але хотілося б звернути увагу на особливість зміни мови системи після встановлення мовного пакета за допомогою консолі. Ця особливість описана в тій самій вікі, на яку я дав посилання раніше, в підрозділі «Додавання мови до списку мов».

Я встановлю мовний пакет без підключення до Інтернету.

Після повної локалізації системи обов'язково створіть образ системи.

Крок 4 – встановлення необхідних програм

Т.к. в системах LTSB і LTSC немає магазину додатків, то встановлення додатків із «Microsoft Store» викликає деякі труднощі, а саме – завантаження програми. Для завантаження програм компанія «Adguard» зробила дуже зручний сервіс – "Adguard Store", за допомогою якого можна отримати тимчасові посилання на завантаження програм та їх компонентів.

Для встановлення програми Вам знадобляться файли з розширеннями Appx і AppxBundle. Перед встановленням програми необхідно встановити його компоненти. Як правило, компоненти від програми можна інтуїтивно відрізнити за назвою файлу.

Щоб не робити статтю надто великою не докладно описуватиму процес встановлення додатків, тим більше що по установці є докладна інструкція. Але додам ще один спосіб встановлення програм у поточний обліковий запис. Програми можна встановити за допомогою програми "App Installer", але для встановлення програм буде потрібно підключення до інтернету, зате програми можна буде встановити подвійним клацанням миші і вам не знадобляться його компоненти, всі необхідні компоненти завантажить і встановить "App Installer".

І невелике нагадування, при установці програми до поточного облікового запису не можна буде запечатати систему. Як встановити програми, щоб була можливість запечатати систему, дивіться у вищезгаданій інструкції. А для перевірки роботи мультикіоску цілком вистачить наявних додатків.

Крок 5 – створення файлу налаштування для мультикіоску

Ось ми й дісталися найцікавішого – до налаштування режиму кіоску. Дивимося в інструкцію з налаштування та бачимо. Насамперед нам знадобиться створити конфігураційний XML-файл, повний приклад якого можна подивитись тут.

Почнемо з налаштування розташування плиток. Найпростіший спосіб створення XML-конфігурації налаштування плиток – експорт їхнього поточного стану.

Насамперед додамо в меню «Пуск» плитки тих додатків, які нам потрібні. Викликаємо пошук «Win+s», знаходимо потрібну програму, натискаємо на ньому правою кнопкою миші та вибираємо пункт «Закріпити на початковому екрані».

Я закріпив такі програми:

  • Блокнот
  • Калькулятор
  • Internet Explorer
  • фарба
  • WordPad
  • Параметри
  • Безпека Windows

Останні два додатки було закріплено т.к. у стандартній поставці LTSC інших універсальних програм просто немає. Зверніть увагу, що плитки класичних додатків посилаються на ярлики. Тепер шляхом пересування плиток безпосередньо в меню "Пуск" я поділю закріплені плитки на дві групи. Для створення нової групи плиток перетягніть плитку істотно вище або нижче за інші плитки, при цьому висвітлиться інтуїтивно зрозумілий роздільник. Ви можете назвати групи на власний розсуд, для цього розмістіть курсор миші вище за групу, а коли з'явиться напис – «Назвати групу» натисніть лівою кнопкою миші. Першу групу я назву «Налаштування», до неї увійдуть плитки «Параметри» та «Безпека Windows». Другу групу я назву «Офісні додатки», до якої увійдуть решта плиток. До речі, можна переміщати повністю групи плиток, перетягуючи їх за дві смужки, які знаходяться праворуч від назви групи.

Т.к. на плитці "Безпека Windows" не вміщується назва повністю, я зміню її розмір на "Широкий". Для зміни розміру плитки потрібно натиснути на плитці правою кнопкою миші та вибрати пункт "Змінити розмір".

Після налаштування експортуємо поточний стан, виконуємо команду в середовищі PowerShell - "Export-StartLayout - path C:SysprepStartLayout.xml".

Далі найпростіше не створювати файл налаштувань самостійно, а звідси взяти приклад файлу налаштувань – натискаємо кнопку «Copy», вставляємо вміст у блокнот і зберігаємо як «MultiAppKiosk.xml». Тепер змінюємо налаштування на свої. Для зміни налаштувань прикріплених плиток копіюємо весь блок "StartLayoutCollection" з "StartLayout.xml" в "MultiAppKiosk.xml". Щоб додати програми до дозволених, необхідно вставити ідентифікатори універсальних програм у розділ «AllowedApps» і в цей же блок додати повний шлях до виконуваних файлів класичних програм, який прописаний у властивостях ярликах, на які посилаються плитки. Щоб швидко перейти до ярлика, натисніть правою кнопкою миші на закріпленій плитці та пройдіть по меню «Додатково > Перейти до розташування файлу». Зверніть увагу, для вказівки ID універсальної програми використовується параметр AppUserModelId, а для вказівки повного шляху до класичної програми використовується параметр DesktopAppPath. І ще один маленький нюанс, якщо Ви плануєте використовувати IE в системі x64, то в переліку дозволених додатків необхідно вказати два шляхи для файлу «Program FilesInternet Exploreriexplore.exe» і «Program Files (x86)Internet Exploreriexplore.exe».

Доступ до папок я не даватиму, тому видаляю секцію «FileExplorerNamespaceRestrictions».

Відображення панелі завдань мені не завадить, тому в секції Taskbar залишаю все як є.

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

У розділі Configs облікові записи прив'язані до профілів, зверніть увагу, що до одного профілю можна прив'язати безліч облікових записів. Але т.к. мене цікавить лише один обліковий запис, то я видалю всі прив'язки крім першої – блоки Config. У прив'язці, що залишилася, пропишу ім'я користувача «User».

У мене вийшов такий файл з параметрами

MultiAppKiosk.xml

<?xml version="1.0" encoding="utf-8" ?>
<AssignedAccessConfiguration 
  xmlns="http://schemas.microsoft.com/AssignedAccess/2017/config"
  xmlns:rs5="http://schemas.microsoft.com/AssignedAccess/201810/config"
  >
  <Profiles>
      <Profile Id="{9A2A490F-10F6-4764-974A-43B19E722C23}">
          <AllAppsList>
              <AllowedApps>
                  <App AppUserModelId="WINDOWS.IMMERSIVECONTROLPANEL_CW5N1H2TXYEWY!MICROSOFT.WINDOWS.IMMERSIVECONTROLPANEL" />
                  <App AppUserModelId="Microsoft.Windows.SecHealthUI_cw5n1h2txyewy!SecHealthUI" />
                  <App DesktopAppPath="%windir%system32notepad.exe" />
                  <App DesktopAppPath="C:Program FilesInternet Exploreriexplore.exe" />
                  <App DesktopAppPath="%windir%system32win32calc.exe" />
                  <App DesktopAppPath="%windir%system32mspaint.exe" />
                  <App DesktopAppPath="%ProgramFiles%Windows NTAccessorieswordpad.exe" />
              </AllowedApps>
          </AllAppsList>
          <StartLayout>
              <![CDATA[<LayoutModificationTemplate xmlns:defaultlayout="http://schemas.microsoft.com/Start/2014/FullDefaultLayout" xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout" Version="1" xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification">
                    <LayoutOptions StartTileGroupCellWidth="6" />
                    <DefaultLayoutOverride>
                      <StartLayoutCollection>
                        <defaultlayout:StartLayout GroupCellWidth="6">
                          <start:Group Name="Настройки">
                            <start:Tile Size="2x2" Column="0" Row="0" AppUserModelID="WINDOWS.IMMERSIVECONTROLPANEL_CW5N1H2TXYEWY!MICROSOFT.WINDOWS.IMMERSIVECONTROLPANEL" />
                            <start:Tile Size="4x2" Column="2" Row="0" AppUserModelID="Microsoft.Windows.SecHealthUI_cw5n1h2txyewy!SecHealthUI" />
                          </start:Group>
                          <start:Group Name="Офисные приложения">
                            <start:DesktopApplicationTile Size="2x2" Column="2" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%MicrosoftWindowsStart MenuProgramsAccessoriesWordpad.lnk" />
                            <start:DesktopApplicationTile Size="2x2" Column="0" Row="0" DesktopApplicationLinkPath="%APPDATA%MicrosoftWindowsStart MenuProgramsAccessoriesNotepad.lnk" />
                            <start:DesktopApplicationTile Size="2x2" Column="2" Row="0" DesktopApplicationLinkPath="%ALLUSERSPROFILE%MicrosoftWindowsStart MenuProgramsAccessoriesCalculator.lnk" />
                            <start:DesktopApplicationTile Size="2x2" Column="0" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%MicrosoftWindowsStart MenuProgramsAccessoriesPaint.lnk" />
                            <start:DesktopApplicationTile Size="2x2" Column="4" Row="0" DesktopApplicationLinkPath="%APPDATA%MicrosoftWindowsStart MenuProgramsAccessoriesInternet Explorer.lnk" />
                          </start:Group>
                        </defaultlayout:StartLayout>
                      </StartLayoutCollection>
                    </DefaultLayoutOverride>
                  </LayoutModificationTemplate>
              ]]>
          </StartLayout>
          <Taskbar ShowTaskbar="true"/>
      </Profile>
  </Profiles>
  <Configs>
      <Config>
          <Account>User</Account>
          <DefaultProfile Id="{9A2A490F-10F6-4764-974A-43B19E722C23}"/>
      </Config>
  </Configs>
</AssignedAccessConfiguration>

Коли ви будете робити свої XML-файли налаштування не забувайте, що кожен профіль повинен мати унікальний ID, причому не тільки в межах одного XML-файлу, а в одній ОС. Тобто. в ідеалі, щоб не заплутатися, можна щоразу створювати новий ідентифікатор, це можна зробити в середовищі PowerShell за допомогою команди «[guid]::NewGuid()». І обов'язково зберігайте файл у кодуванні «UTF-8», якщо файл буде збережений у кодуванні «ANSI», то при складанні пакета підготовки отримайте помилку, якщо в XML-файлі буде кирилиця.

Крок 6 – застосування налаштувань мультикіоску

Розглянемо два способи застосування параметрів, описаних у конфігураційному файлі. Перший – за допомогою пакета підготовки, який потрібно створювати у ICD. Для когось, можливо, такий спосіб буде звичнішим. Другий – з використанням MMD Bridge WMI Provider, цей спосіб мені здався зручнішим.

спосіб №1

Хто не має ICD, завантажуємо ADK та встановлюємо. Установка ADK дуже проста, набір компонентів можна залишити за замовчуванням.

Запускаємо ICD, натискаємо на плитку «Додаткова підготовка», вказуємо ім'я та папку проекту та натискаємо «Далі». У наступному вікні вибираємо «Всі випуски Windows для настільних комп'ютерів» та натискаємо «Далі». Імпорт пакету підготовки можна пропустити, натискаючи «Готово».

Розкриваємо меню «Параметри середовища виконання», далі розкриваємо підменю «AssignedAccess» і вибираємо пункт «MultiAppAssignedAccessSettings». У верхній частині середньої секції вікна ICD натискаємо кнопку «Огляд» та вказуємо розташування XML-файлу з налаштуваннями. Про всяк випадок можна зберегти проект натиснувши Ctrl+s. У лівій верхній частині ICD вибираємо «Експорт» у меню вибираємо пункт «Пакет підготовки». Як власник вибираємо «ІТ-адміністратор» всі інші питання можна пропустити, натискаючи «Далі» і наприкінці натискаємо «Складання» та «Готово».

У встановленій системі не забуваємо створити користувача «User», його не можна додавати до групи «Адміністратори», інакше мультикіоск працювати не буде. Я створив користувача в оснастці "Керування комп'ютером" з необмеженим терміном дії пароля.

Тепер запускаємо пакет підготовки у раніше встановленій системі. Після застосування пакета підготовки зміниться меню пуск і адміністратора. У лівому стовпці пуску повинні зникнути кнопки: "Документи", "Зображення", "Параметри". Якщо меню пуск не змінилося, щось пішло не так. Установлений пакет можна видалити, якщо відкрити вікно «Параметри > Облікові записи > Доступ до облікового запису місця роботи або навчального закладу > Додавання або видалення пакета підготовки».

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

спосіб №2

Застосування налаштувань за допомогою MMD Bridge WMI Provider описано тут. Зручність даного способу гнучкості використання та можливості позбутися безлічі ручних операцій, які потрібні для створення пакету підготовки. Тут кожен для себе може зробити рішення, яке буде зручним саме йому. Я собі зробив ось таку пару скриптів.

MiltiKiosk.bat – скрипт для запуску

@echo off
chcp 1251>nul

if not exist "%~dp0psexec.exe" call :ShowMessage "‡‡‡‡‡‡‡‡‡‡‡‡‡Для работы скрипта необходим файл psexec.exe‡‡Для завершения работы скрипта нажмите любую клавишу"&pause>nul&exit

net session>nul 2>nul
if %errorLevel% neq 0 (powershell -command "Start-Process "%~s0" -Verb RunAs"&exit)

for /f "tokens=2 delims==" %%i in ('wmic useraccount where "Name='%UserName%'" get SID /value^|find "SID"') do set SID=%%i
reg add HKU%SID%SoftwareSysinternalsPsExec /v EulaAccepted /t REG_DWORD /d 1 /f

for /f %%i in ('dir "%~dp0%~n0*.ps1" /b /o:n') do set PSFilePath=%~dp0%%i
if not defined PSFilePath (echo Не найдено PS файлов с началом названия - "%~n0"&pause&exit)
set PSFilePath=%PSFilePath: =` %
"%~dp0psexec.exe" -i -s powershell -command "Start-Process powershell.exe -ArgumentList '-ExecutionPolicy Unrestricted -Command %PSFilePath%'"

exit

:ShowMessage
    setlocal enabledelayedexpansion
    set String=%~1
    if not defined String (echo.&setlocal disabledelayedexpansion&goto :eof)
    set /a ConCols=120 & set /a Num=1
    set "String[!Num!].str=%String:‡=" & set /a Num+=1 & set "String[!Num!].str=%"
    for /l %%a in (1,1,%Num%) do (
        for /l %%b in (0,1,%ConCols%) do if "!String[%%a].str:~%%b!" == "" (set "String[%%a].str= !String[%%a].str! "&set /a String[%%a].len-=1) else (set /a String[%%a].len+=0||set /a String[%%a].len=0)
        if not defined String[%%a].str (set String[%%a].str= )
        if not !String[%%a].len! equ 0 (call set String[%%a].str=%%String[%%a].str:~,!String[%%a].len!%%)
        if "!String[%%a].str: =!"=="" (echo.) else (echo !String[%%a].str!))
    setlocal disabledelayedexpansion
goto :eof

MiltiKiosk_Ver.12.ps1 – основний скрипт

Function ConvertEncoding ([string]$From, [string]$To) {
    Begin{$encFrom = [System.Text.Encoding]::GetEncoding($From);$encTo = [System.Text.Encoding]::GetEncoding($To)}
    Process{$bytes = $encTo.GetBytes($_);$bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes);$encTo.GetString($bytes) -replace [char]0, ''}
}

Function ShowMessage ($Message='', $Align=0) {
    Try {$Align = [decimal]$Align} Catch {Return 'Для параметра Align может быть указано только число' | ConvertEncoding 'windows-1251' -To 'UTF-16'}
    if ($Message -is [int]) {for ($i=1; $i -le $Message; $i++) {Write-Host}; Return}
    if ([System.Text.Encoding]::Default.WindowsCodePage -eq 1252) {$Message = $Message | ConvertEncoding 'windows-1251' -To 'UTF-16'}
    if ($Message -is [string]) {[array] $Message = $Message}
    foreach ($String in $Message) {
        Try {$String = [int]$String} Catch {}
        if ($String -is [int]) {for ($i=1; $i -le $String; $i++) {Write-Host}; continue}
        if ($Host.UI.RawUI.BufferSize.Width -gt $String.Length) {
            if ($Align -eq 0) {Write-Host $String
            } else {Write-Host ("{0}{1}" -f (' ' * (([Math]::Max(0, $Host.UI.RawUI.BufferSize.Width / $Align) - [Math]::Floor($String.Length / $Align)))), $String)}
        } else {Write-Host $String}
    } 
}

$script:NameSpace="rootcimv2mdmdmmap"
$script:ClassName="MDM_AssignedAccess"
$script:MultiAppKiosk = Get-CimInstance -Namespace $NameSpace -ClassName $ClassName
if (-not $MultiAppKiosk) {ShowMessage -Message (3, 'Ошибка получения объекта настроек', 2, 'Нажмите "Enter" для завершения рабты скрипта') -Align 2; Read-Host; Exit}

Function MainMenu() {
    ShowMessage (13, ' 0 - Выход', ' 1 - Выбрать XML-файл для установки', ' 2 - Показать текущую конфигурацию мультикиоска', ' 3 - Удалить настройки мультикиоска', 1)
    $local:PromptText = 'Выберите действие'
    if ([System.Text.Encoding]::Default.WindowsCodePage -eq 1252) {$PromptText = $PromptText | ConvertEncoding 'windows-1251' -To 'UTF-16'}

    $local:Selections = 1..2
    While ($true) {
        $Select = Read-Host -Prompt $PromptText
        Switch ($Select) {
            0 {exit}
            1 {XMLSelection}
            2 {ShowMessage -Message (1, 'Начало конфигурации') -Align 2; Write-Host $MultiAppKiosk.Configuration; ShowMessage -Message ('Конец конфигурации', 1, 'Для возврата в меню нажмите "Enter"', 1) -Align 2; Read-Host}
            3 {$MultiAppKiosk.Configuration = $Null; Set-CimInstance -CimInstance $MultiAppKiosk; ShowMessage -Message (1, 'Выполнена команда удаления настроек', 1) -Align 2}
            DEFAULT {ShowMessage 'Выбрано недопустимое значение'}
        }
        if ($Selections -contains $Select) {Clear-Host; ShowMessage (15, ' 0 - Выход', ' 1 - Выбрать XML-файл для установки', ' 2 - Показать текущую конфигурацию мультикиоска', ' 3 - Удалить настройки мультикиоска', 1)}
    }
}

Function XMLSelection() {
    Clear-Host

    if (!(Test-Path -Path $PSScriptRoot'XML')) {ShowMessage -Message (13, 'Не найден каталог', $('"'+$PSScriptRoot+'XML"'), 1, 'Нажмите "Enter" для возврвта в предыдущее меню') -Align 2; Read-Host; Return}

    $local:XMLList = @()
    $XMLList += Get-ChildItem -Path $PSScriptRoot'XML' -name -filter '*.xml'
    if ($XMLList.Count -eq  0) {ShowMessage -Message (13, 'Не найдено XML-файлов в каталоге', $('"'+$PSScriptRoot+'XML"'), 1, 'Нажмите "Enter" для возврвта в предыдущее меню') -Align 2; Read-Host; Return}

    [int]$local:Indent = 13 - $XMLList.Count / 2; if ($Indent -lt 1) {$Indent = 1}
    ShowMessage ($Indent, ' 0 - Вернуться в предыдущее меню')
    for ($i=0; $i -le $XMLList.GetUpperBound(0); $i++) {Write-Host $(' '+($i+1)+' - '+$XMLList[$i])}
    Write-Host
    $local:PromptText = 'Выберите файл для установки'
    if ([System.Text.Encoding]::Default.WindowsCodePage -eq 1252) {$PromptText = $PromptText | ConvertEncoding 'windows-1251' -To 'UTF-16'}

    $local:Selections = 1..$XMLList.Count
    $local:BackToPrevMenu = 0
    While ($BackToPrevMenu -eq 0) {
        $Select = Read-Host -Prompt $PromptText
        Switch ($Select) {
            0 {$BackToPrevMenu = 1}
            {$Selections -contains $Select} {ShowMessage $('Дана команда на применение настроек из файла '+$XMLList[$Select-1]);
                $local:Config = (Get-Content -encoding UTF8 -path $($PSScriptRoot+'XML'+$XMLList[$Select-1]) -Raw).Trim()
                $local:GUIDs = [regex]::matches($Config, '{.+?}') | select -ExpandProperty Value | Get-Unique
                foreach ($GUID in $GUIDs) {$Config = $Config -replace $(''+$GUID),$('{'+[guid]::NewGuid()+'}')}
                $Config = $Config -replace '&','&' -replace '<','<' -replace '>','>' -replace "'",''' -replace '"','"'
                $MultiAppKiosk.Configuration = $Config
                Set-CimInstance -CimInstance $MultiAppKiosk
            }
            DEFAULT {ShowMessage ('Выбрано недопустимое значение')} 
        }
    }
}

MainMenu

Якщо ви хочете використовувати моє рішення, то збережіть в одну папку вказані вище скрипти з їх оригінальними іменами і в цю ж папку покладіть файл «PsExec.exe». У цій же папці створіть папку «XML» і скопіюйте в неї файли XML для налаштування мультикіоска. Я використовуватиму той самий файл, що і в першому способі.

MultiAppKiosk.xml

<?xml version="1.0" encoding="utf-8" ?>
<AssignedAccessConfiguration 
  xmlns="http://schemas.microsoft.com/AssignedAccess/2017/config"
  xmlns:rs5="http://schemas.microsoft.com/AssignedAccess/201810/config"
  >
  <Profiles>
      <Profile Id="{9A2A490F-10F6-4764-974A-43B19E722C23}">
          <AllAppsList>
              <AllowedApps>
                  <App AppUserModelId="WINDOWS.IMMERSIVECONTROLPANEL_CW5N1H2TXYEWY!MICROSOFT.WINDOWS.IMMERSIVECONTROLPANEL" />
                  <App AppUserModelId="Microsoft.Windows.SecHealthUI_cw5n1h2txyewy!SecHealthUI" />
                  <App DesktopAppPath="%windir%system32notepad.exe" />
                  <App DesktopAppPath="C:Program FilesInternet Exploreriexplore.exe" />
                  <App DesktopAppPath="%windir%system32win32calc.exe" />
                  <App DesktopAppPath="%windir%system32mspaint.exe" />
                  <App DesktopAppPath="%ProgramFiles%Windows NTAccessorieswordpad.exe" />
              </AllowedApps>
          </AllAppsList>
          <StartLayout>
              <![CDATA[<LayoutModificationTemplate xmlns:defaultlayout="http://schemas.microsoft.com/Start/2014/FullDefaultLayout" xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout" Version="1" xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification">
                    <LayoutOptions StartTileGroupCellWidth="6" />
                    <DefaultLayoutOverride>
                      <StartLayoutCollection>
                        <defaultlayout:StartLayout GroupCellWidth="6">
                          <start:Group Name="Настройки">
                            <start:Tile Size="2x2" Column="0" Row="0" AppUserModelID="WINDOWS.IMMERSIVECONTROLPANEL_CW5N1H2TXYEWY!MICROSOFT.WINDOWS.IMMERSIVECONTROLPANEL" />
                            <start:Tile Size="4x2" Column="2" Row="0" AppUserModelID="Microsoft.Windows.SecHealthUI_cw5n1h2txyewy!SecHealthUI" />
                          </start:Group>
                          <start:Group Name="Офисные приложения">
                            <start:DesktopApplicationTile Size="2x2" Column="2" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%MicrosoftWindowsStart MenuProgramsAccessoriesWordpad.lnk" />
                            <start:DesktopApplicationTile Size="2x2" Column="0" Row="0" DesktopApplicationLinkPath="%APPDATA%MicrosoftWindowsStart MenuProgramsAccessoriesNotepad.lnk" />
                            <start:DesktopApplicationTile Size="2x2" Column="2" Row="0" DesktopApplicationLinkPath="%ALLUSERSPROFILE%MicrosoftWindowsStart MenuProgramsAccessoriesCalculator.lnk" />
                            <start:DesktopApplicationTile Size="2x2" Column="0" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%MicrosoftWindowsStart MenuProgramsAccessoriesPaint.lnk" />
                            <start:DesktopApplicationTile Size="2x2" Column="4" Row="0" DesktopApplicationLinkPath="%APPDATA%MicrosoftWindowsStart MenuProgramsAccessoriesInternet Explorer.lnk" />
                          </start:Group>
                        </defaultlayout:StartLayout>
                      </StartLayoutCollection>
                    </DefaultLayoutOverride>
                  </LayoutModificationTemplate>
              ]]>
          </StartLayout>
          <Taskbar ShowTaskbar="true"/>
      </Profile>
  </Profiles>
  <Configs>
      <Config>
          <Account>User</Account>
          <DefaultProfile Id="{9A2A490F-10F6-4764-974A-43B19E722C23}"/>
      </Config>
  </Configs>
</AssignedAccessConfiguration>

Трохи про особливості скрипту. Скрипт розрахований на використання XML-файлів з кодуванням UTF8, якщо ви хочете використовувати кодування ANSI, то з параметра читання файлу приберіть параметр encoding UTF8. У папку XML необхідно розміщувати XML-файли без заміни символів, скрипт сам замінить спецсимволи на відповідні позначення. Щоб не заплутатися в GUID'ах прив'язки користувачів до профілів, ви можете просто вказувати номер або ім'я користувача у фігурних дужках, весь вміст у фігурних дужках буде замінено на GUID'и.

Використовувати скрипт дуже просто, запускаєте та вибираєте необхідний пункт. Для зміни поточної конфігурації на нову не обов'язково видаляти поточну, її буде перезаписано. Не забувайте створювати користувачів, прописаних у конфігураційному файлі.

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

Крок 7 – запечатування системи

Мультікіоск працює, ну от і все, здавалося б…

Якщо все йде за планом, то ви чогось не помічаєте.

Не забуваймо, що нам ще потрібно переводити систему з режиму аудиту до режиму вітання. Ну ми ж до цього готові, запускаємо Sysprep.bat, вибираємо пункт 2, система запечатується. Включаємо пристрій, система завантажується, входимо до облікового запису користувача для якого налаштований мультикіоск і не можемо увійти. Після напису «Ласкаво просимо» з'являється напис «Вихід із системи».

Спочатку хотів описати лише вирішення проблеми, але пізніше вирішив описати кроки з виявлення проблеми та пошуку найпростішого рішення т.к. напевно, багатьох читаючих мучать сумніви – «А якщо ось так…». Думаю, що опис різних експериментів заощадить вам значну частину часу за бажання знайти інше рішення. Щоб інформація була максимально точною, і щоб вкотре переконатися у відсутності будь-яких помилок, опис експериментів робитиму у форматі «зробив – записав». Тобто. я пророблю описані експерименти ще раз.

експерименти

Що ж у нас вийшло? У системі два облікові записи:

«Admin» – у групі «Адміністратори»
«User» – у групі «Користувачі»
У режимі аудиту мультикіоск працював, запечатали – не працює.

експеримент 1

Видаляємо встановлений пакет підготовки, в оснастці «Керування комп'ютером» видаляємо користувача «User» та створюємо нового користувача з ім'ям «User», застосовуємо пакет підготовки, заходимо до облікового запису «User» – не працює. Заходимо під ім'ям Admin, видаляємо користувача User з групи Користувачі, додаємо в групу Адміністратори, заходимо під ім'ям User - не працює. Заходимо під ім'ям Admin, видаляємо пакет підготовки з мультикіоском, заходимо під ім'ям User - вдалося увійти, але природно режим мультикіоска не працює т.к. було видалено пакет підготовки.

експеримент 2

Заливаємо образ системи – русифікований у режимі аудиту.

ОС завантажилася, натискаємо Win+r, т.к. вікно sysprep'а у нас закрилося автоматично виконуємо команду «sysprep», у вікні запускаємо «sysprep». Налаштування sysprep'a у вікні: "Перехід у вікно привітання системи (OOBE)", "Підготовка до використання", "Перезавантаження". Тиснемо «ОК» і чекаємо на привітання ОС. Відповідаємо на запитання при першому завантаженні системи: Continue in selected language? - "Російський"; регіон - Росія; розкладка клавіатури - Російська; додати другу розкладку клавіатури – пропустити; "Давайте підключимо вас до мережі" - "Поки пропустити"; підключіться до інтернету – ні; ліцензійна угода – прийняти; "Хто буде використовувати цей комп'ютер" - "Test"; створення пароля – залишаю поле порожнім; зручна робота на різних пристроях – ні; параметри конфіденційності – прийняти. ОС завантажилася, в оснастці «Керування комп'ютером» створюємо користувача з ім'ям «User», додаємо пакет підготовки. Результат – не працює.

експеримент 3

Заливаємо образ системи – русифікований у режимі аудиту.

ОС завантажилася, підключаємо систему до інету, виконуємо команду "gpedit.msc" і в розділі "Центр оновлень Windows" включаємо параметр "Включити рекомендовані оновлення через автоматичне оновлення", про всяк випадок перезавантажуємося. У центрі оновлень тиснемо «Перевірити наявність оновлень» і перезавантажуємося доти, доки не будуть встановлені всі оновлення. Відключаємо систему від Інтернету. Запускаємо "sysprep" у графічному режимі та повторюємо всі дії, які описані в попередньому кроці із запуску утиліти "sysprep" до додавання пакета підготовки. Результат – не працює.

експеримент 4

Заливаємо образ системи – англомовний як аудит.

Запускаємо «sysprep» у графічному режимі, запечатуємо ОС з тими самими параметрами як і під час експерименту 2. При першому завантаженні системи вибираємо самі параметри як і експерименті 2, крім регіональних і мовних параметрів т.к. російської немає. Так само створюємо користувача «User» і додаємо пакет підготовки. Результат – працює. Тобто. проблема пов'язана із локалізацією.

експеримент 5

Заливаємо образ системи – русифікований у режимі аудиту.

У оснащенні «Керування комп'ютером» створюємо користувача «User», додаємо пакет підготовки, заходимо в обліковий запис «User», мультикіоск працює.

Виходимо з облікового запису, заходимо під обліковим записом Admin. Запускаємо PowerShell з правами адміністратора, виконуємо команду «Dism/online/Get-Intl» і бачимо «Мова інтерфейсу користувача за умовчанням: en-US».

Завантажуємося з флешки у WinPE, розгорнута ОС у мене на диску E. Виконуємо команду Dism /image:E: /Set-UILang:ru-ru. Дивимося на результат, виконуємо "Dism / image: E: / Get-Intl" і бачимо "Default system UI language: ru-RU".

Завантажуємось у систему, входимо до облікового запису «User», мультикіоск не працює.

Для чіткої фіксації причинно-наслідкового зв'язку появи проблеми спробуємо ще раз зробити мультикіоск робітником та неробочим.

Завантажуємося з флешки у WinPE, розгорнута ОС у мене на диску E. Виконуємо команду Dism /image:E: /Set-UILang:en-us. Дивимося на результат, виконуємо "Dism / image: E: / Get-Intl" і бачимо "Default system UI language: en-US".

Завантажуємося в систему, входимо до облікового запису «User», мультикіоск працює.

Завантажуємося з флешки у WinPE, розгорнута ОС у мене на диску E. Виконуємо команду Dism /image:E: /Set-UILang:ru-ru. Дивимося на результат, виконуємо "Dism / image: E: / Get-Intl" і бачимо "Default system UI language: ru-RU".

Завантажуємось у систему, входимо до облікового запису «User», мультикіоск не працює.

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

експеримент 6

Для чистоти експерименту перезаливаємо систему. Заливаємо образ системи – русифікований у режимі аудиту.

Запускаємо «sysprep» у графічному режимі, запечатуємо ОС із тими самими параметрами як і під час експерименту 2. Чекаємо вітання ОС і відповідаємо питанням: «Continue in selected language?» - "English (United States)"; регіон - Росія; Розкладка клавіатури - Російська. Далі всі параметри обрані як і експерименті 2.

Дивимося параметри значення мови інтерфейсу користувача за замовчуванням. Виконуємо команду "Dism/online/Get-Intl" і бачимо "Default system UI language: en-US". У оснащенні «Керування комп'ютером» створюємо користувача «User», додаємо пакет підготовки, заходимо в обліковий запис «User», мультикіоск працює.

Пробуємо зламати кіоск шляхом зміни мови інтерфейсу користувача за замовчуванням. Заходимо в користувача Test, який був створений при першому завантаженні системи і включаємо для нього автоматичний вхід щоб система не завантажувалася в обліковий запис User, відразу. Виконуємо «netplwiz», вибираємо користувача «Test», знімаємо прапорець «Вимагати введення імені користувача та пароля» та застосовуємо параметри.

Завантажуємося з флешки у WinPE. Виконуємо команду "Dism /image: E: / Set-UILang: ru-ru". Дивимося на результат, виконуємо "Dism / image: E: / Get-Intl" і бачимо "Default system UI language: ru-RU".

Завантажуємося в систему, намагаємося увійти до облікового запису «User», мультикіоск працює. Тобто. його не вдається зламати. А чи можна його таким чином змусити працювати?

експеримент 7

Заливаємо образ системи – русифікований у режимі аудиту.

Запускаємо "Sysprep.bat", вибираємо пункт 2. Завантажуємося в систему, в оснащенні "Управління комп'ютером" створюємо користувача "User", додаємо пакет підготовки, заходимо в обліковий запис "User", мультикіоск не працює.

Завантажуємося з флешки у WinPE. Виконуємо команду «Dism/image:E:/Set-UILang:en-us». Дивимося на результат, виконуємо "Dism / image: E: / Get-Intl" і бачимо "Default system UI language: en-US".

Завантажуємося в систему, намагаємося увійти до облікового запису «User», мультикіоск не працює.

Виходить, що шляхом зміни налаштування мови інтерфейсу користувача за умовчанням можна вплинути на працездатність мультикіоска тільки коли система в режимі аудиту або при першому завантаженні після запечатування системи. А це означає, що доведеться запечатувати систему з файлом відповідей, в якому буде обрана мова системи англійська, а далі змінювати налаштування системи, щоб інтерфейс був російським. Не дуже гарне рішення. Чи може проблему вирішити шляхом встановлення мовного пакета або встановленням додаткових мовних пакетів?

експеримент 8

Заливаємо образ системи – англомовний як аудит.

Підключаємося до інтернету, в параметрах системи заходимо до розділу «Language» вибираємо «Add language», вибираємо мову «Російська», натискаємо «Next», параметри установки залишаємо за замовчуванням, натискаємо «Install», після встановлення мовного пакета перезавантажуємо систему, тепер на русифікована. Відключаємо систему від інтернету, запускаємо Sysprep.bat, вибираємо пункт 2.

Після завантаження системи в оснастці «Керування комп'ютером» створюємо користувача «User», додаємо пакет підготовки, заходимо в обліковий запис «User», мультикіоск не працює.

експеримент 9

Спробуємо русифікувати систему до встановлення, в режимі офлайн. Заодно буде короткий лікнеп з локалізації дистрибутива.

Беру флешку із чистим оригінальним дистрибутивом – X21-96381. Вона буде диском "E". Для монтування образів створюю папки: "c:MountInstall", "c:MountWinre", "c:MountBoot". Беру комплект пакетів локалізації – X21-87814. І в папку "c:Mount" копіюю з нього пакети: "Microsoft-Windows-Client-Language-Pack_x86_ru-ru.cab", "lp.cab", "WinPE-Setup_ru-ru.cab". Запускаю консоль із правами адміністратора. Думаю, що подальші команди будуть зрозумілими без коментарів.

Команди локалізації

cd c:mount
dism /Mount-Wim /WimFile:e:sourcesinstall.wim /index:1 /MountDir:Installcode
dism /Image:Install /Add-Package /PackagePath:Microsoft-Windows-Client-Language-Pack_x86_ru-ru.cabcode
dism /Image:Installcode /Set-AllIntl:ru-ru
dism /Image:Install /Set-TimeZone:"Russian Standard Time"code

dism /Mount-Wim /WimFile:InstallWindowsSystem32RecoveryWinre.wim /index:1 /MountDir:Winrecode
dism /Image:Winre /Add-Package /PackagePath:lp.cabcode
dism /Image:Winrecode /Set-AllIntl:ru-ru
dism /Image:Winre /Set-TimeZone:"Russian Standard Time"code
dism /Unmount-Image /MountDir:Winre /Commitcode

dism /Image:Install /Gen-LangINI /distribution:E: /Set-AllIntl:ru-RUcode
dism /image:Install /Set-SetupUILang:RU-ru /distribution:E:code
dism /Unmount-Image /MountDir:Install /Commitcode

dism /mount-wim /wimfile:e:sourcesboot.wim /index:1 /mountdir:Bootcode
dism /Image:Boot /Add-Package /PackagePath:lp.cabcode
dism /Image:Bootcode /Set-AllIntl:ru-ru
copy e:sourceslang.ini Bootsourceslang.inicode
dism /Unmount-Image /MountDir:Boot /Commitcode

dism /mount-wim /wimfile:e:sourcesboot.wim /index:2 /mountdir:Bootcode
dism /Image:Boot /Add-Package /PackagePath:lp.cabcode
dism /Image:Boot /Add-Package /PackagePath:WinPE-Setup_ru-ru.cabcode
dism /Image:Bootcode /Set-AllIntl:ru-ru
copy e:sourceslang.ini Bootsourceslang.ini /ycode
dism /Unmount-Image /MountDir:Boot /Commit

Завантажуємося з флешки, вибираємо російську мову та ставимо систему на чистий диск. Коли система просить вибрати регіон, натискаємо «Ctrl+Shift+F3». У оснащенні «Керування комп'ютером» створюємо користувача «User», додаємо пакет підготовки, заходимо до облікового запису «User», мультикіоск не працює.

Завантажуємося з флешки у WinPE. Виконуємо команду «Dism/image:E:/Set-UILang:en-us».

Завантажуємося в систему, намагаємося увійти до облікового запису «User», мультикіоск працює.

Мабуть, справа не в методах додавання пакета, спробуємо додати додаткові пакети.

експеримент 10

Беремо флешку, яку ми підготували на попередньому кроці.

Беремо пакет "Feat on Demand" - X21-87815. У папку "c:Mount" копіюю з нього пакети: «Microsoft-Windows-LanguageFeatures-Basic-ru-ru-Package~31bf3856ad364e35~x86~~.cab», «Microsoft-Windows-LanguageFeatures-OCR-ru-ru-Package~31bf3856ad364e35~x86~~.cab», «Microsoft-Windows-LanguageFeatures-Handwriting-ru-ru-Package~31bf3856ad364e35~x86~ ~.cab», «Microsoft-Windows-LanguageFeatures-TextToSpeech-ru-ru-Package~31bf3856ad364e35~x86~~.cab».

Берем пакет «Feat on Demand RDX Updt» – X21-99781. В папку «c:Mount» копирую из него пакеты: «Microsoft-Windows-RetailDemo-OfflineContent-Content-Package~31bf3856ad364e35~x86~~.cab», « Microsoft-Windows-RetailDemo-OfflineContent-Content-ru-ru-Package~31bf3856ad364e35~x86~~.cab».

Запускаємо консоль з правами адміністратора та виконуємо команди:

Команди

cd c:mount
dism /Mount-Wim /WimFile:e:sourcesinstall.wim /index:1 /MountDir:Install
dism /Add-Package /Image:Install /PackagePath:Microsoft-Windows-LanguageFeatures-Basic-ru-ru-Package~31bf3856ad364e35~x86~~.cab
dism /Add-Package /Image:Install /PackagePath:Microsoft-Windows-LanguageFeatures-OCR-ru-ru-Package~31bf3856ad364e35~x86~~.cab
dism /Add-Package /Image:Install /PackagePath:Microsoft-Windows-LanguageFeatures-Handwriting-ru-ru-Package~31bf3856ad364e35~x86~~.cab
dism /Add-Package /Image:Install /PackagePath:Microsoft-Windows-LanguageFeatures-TextToSpeech-ru-ru-Package~31bf3856ad364e35~x86~~.cab
dism /Add-Package /Image:Install /PackagePath:Microsoft-Windows-RetailDemo-OfflineContent-Content-Package~31bf3856ad364e35~x86~~.cab
dism /Add-Package /Image:Install /PackagePath:Microsoft-Windows-RetailDemo-OfflineContent-Content-ru-ru-Package~31bf3856ad364e35~x86~~.cab
dism /Unmount-Image /MountDir:Install /Commit

Завантажуємося з флешки, вибираємо російську мову та ставимо систему на чистий диск. Коли система просить вибрати регіон, натискаємо «Ctrl+Shift+F3». В оснастці «Керування комп'ютером» створюємо користувача «User», додаємо пакет підготовки, заходимо до облікового запису «User». Я отримав чорний екран, який довго висів, тому я виконав гаряче перезавантаження системи.

Видаляємо пакет підготовки, заходимо під користувачем «User», перезавантажуємо систему, додаємо пакет підготовки, мультикіоск не працює.

Завантажуємося з флешки у WinPE. Виконуємо команду «Dism/image:E:/Set-UILang:en-us».

Завантажуємося в систему, намагаємося увійти до облікового запису «User», мультикіоск працює.

Обхід проблеми

Нормальні герої. Завжди йдуть в обхід!

Різні способи встановлення пакетів локалізації не вирішили проблему, отже, доведеться при першому завантаженні після запечатування встановлювати мову «en-us», а після першого завантаження змінювати мовні налаштування.

Заливаємо образ системи – русифікований у режимі аудиту.

У файлі Unattend.xml в параметрі вписуємо en-US, запускаємо Sysprep.bat, вибираємо пункт 2 і дивимося, що у нас вийшло. Екран вітання англійською мовою, мультикіоск – працює. Отже, потрібно додати команду «Unattend.xml» на зміну мови привітання. Для цього необхідно виконати команду «control intl.cpl,,/f:» із зазначенням конфігураційного файлу, в якому буде прописано копіювання поточних параметрів в екран привітання. Вміст конфігураційного файлу виглядатиме ось так.

<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
      <gs:UserList>
        <gs:User UserID="Current" CopySettingsToSystemAcct="true"/> 
    </gs:UserList>
</gs:GlobalizationServices>

Т.к. буде копіювання налаштувань поточного користувача, то виконувати команду потрібно після входу користувача в систему, а це означає, що нам знадобляться. Є одне невелике "але", виконання буде після входу користувача з правами адміністратора. І мені не хотілося б створювати додатковий файл, який буде необхідний для успішного виконання команди. Найкраще рішення реалізувати в єдиному файлі — «Unattend.xml». Для цього просто потрібно буде виконати команду, яка створює файл конфігурації. Думаю, що створимо конфігураційний файл за допомогою команди echo у середовищі cmd, але в ній потрібно екранувати кутові дужки циркумфлексом. Тобто. для створення конфігураційного файлу виходить така команда.

echo ^<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend"^>^<gs:UserList^>^<gs:User UserID="Current" CopySettingsToSystemAcct="true"/^>^</gs:UserList^>^</gs:GlobalizationServices^>>Config.xml

Але нам цю команду потрібно помістити в XML, який має свої вимоги до використання спецсимволів:

Спецсимвол
Заміщувальне значення

>
&gt;

<
&lt;

&
&amp;

"
&apos;

"
&quot;

У результаті створення конфігураційного файлу вийшла ось така команда для «FirstLogonCommands».

cmd.exe /c echo ^&lt;gs:GlobalizationServices xmlns:gs=&quot;urn:longhornGlobalizationUnattend&quot;^&gt;^&lt;gs:UserList^&gt;^&lt;gs:User UserID=&quot;Current&quot; CopySettingsToSystemAcct=&quot;true&quot;/^&gt;^&lt;/gs:UserList^&gt;^&lt;/gs:GlobalizationServices^&gt;&gt;&quot;%TMP%Config.xml&quot;

Далі виконуємо команду із використанням конфігураційного файлу.

control intl.cpl,,/f:&quot;%TMP%Config.xml&quot;

Далі видаляємо раніше створений файл і перезавантажуємо систему. зміни набудуть чинності після перезавантаження.

cmd.exe /c del &quot;%TMP%Config.xml&quot; /q&amp;shutdown /r /f /t 00

У результаті у мене вийшов такий файл відповідей для sysprep'а.

Unattend.xml

<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="specialize">
        <component name="Microsoft-Windows-Deployment" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <RunSynchronous>
                <RunSynchronousCommand wcm:action="add">
                    <Path>reg add HKLMSoftwareMicrosoftWindowsCurrentVersionSetupOOBE /v SetupDisplayedProductKey /t REG_DWORD /d 1 /f</Path>
                    <Order>1</Order>
                    <Description>Dont show key page</Description>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Path>reg add HKLMSoftwareMicrosoftWindowsCurrentVersionSetupOOBE /v UnattendCreatedUser /t REG_DWORD /d 1 /f</Path>
                    <Order>2</Order>
                    <Description>Dont make account</Description>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Path>cmd.exe /c rd %systemdrive%Sysprep /s /q</Path>
                    <Order>3</Order>
                    <Description>Del Folder</Description>
                </RunSynchronousCommand>
            </RunSynchronous>
        </component>
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <AutoLogon>
                <Enabled>true</Enabled>
                <Username>Admin</Username>
            </AutoLogon>
        </component>
    </settings>
    <settings pass="oobeSystem">
        <component name="Microsoft-Windows-International-Core" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <InputLocale>en-US; ru-RU</InputLocale>
            <SystemLocale>ru-RU</SystemLocale>
            <UILanguage>en-US</UILanguage>
            <UILanguageFallback></UILanguageFallback>
            <UserLocale>ru-RU</UserLocale>
        </component>
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <OOBE>
                <HideEULAPage>true</HideEULAPage>
                <HideLocalAccountScreen>true</HideLocalAccountScreen>
                <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
                <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
                <ProtectYourPC>1</ProtectYourPC>
            </OOBE>
            <FirstLogonCommands>
                <SynchronousCommand wcm:action="add">
                    <CommandLine>cmd.exe /c echo ^&lt;gs:GlobalizationServices xmlns:gs=&quot;urn:longhornGlobalizationUnattend&quot;^&gt;^&lt;gs:UserList^&gt;^&lt;gs:User UserID=&quot;Current&quot; CopySettingsToSystemAcct=&quot;true&quot;/^&gt;^&lt;/gs:UserList^&gt;^&lt;/gs:GlobalizationServices^&gt;&gt;&quot;%TMP%Config.xml&quot;</CommandLine>
                    <Description>CreateConfig</Description>
                    <Order>1</Order>
                </SynchronousCommand>
                <SynchronousCommand wcm:action="add">
                    <CommandLine>control intl.cpl,,/f:&quot;%TMP%Config.xml&quot;</CommandLine>
                    <Description>UseConfig</Description>
                    <Order>2</Order>
                </SynchronousCommand>
                <SynchronousCommand wcm:action="add">
                    <CommandLine>cmd.exe /c del &quot;%TMP%Config.xml&quot; /q&amp;shutdown /r /f /t 00</CommandLine>
                    <Description>DelConfig</Description>
                    <Order>3</Order>
                </SynchronousCommand>
            </FirstLogonCommands>
        </component>
    </settings>

Перевіряємо…

Заливаємо образ системи – русифікований у режимі аудиту.

Змінюємо файл Unattend.xml на новий, запускаємо Sysprep.bat, вибираємо пункт 2 і дивимося, що у нас вийшло. При першому завантаженні екрана привітання англійською мовою, система перезавантажується. Екран вітання російською мовою, мультикіоск працює.

Якщо у вас залишилися питання щодо налаштування та ліцензування Windows 10 IoT Enterprise, звертайтесь за адресою [захищено електронною поштою] або на сайт quarta-embedded.ru.
Відповіді на деякі питання Ви можете знайти у нашої вікі або на нашому YouTube-каналі

Автор статті: Борисенков Володимир, технічний експерт компанії Кварта Технології.

Джерело: habr.com