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

?v=1

Windows 10 IoT Enterprise 2019 — маркетинговое наименование очередного выпуска Windows 10. Выход данной версии был объявлен в сентябре 2018 года, соответственно имеет версию 1809, 18 — год, 09 — месяц. По новому выпуску Windows 10 1809 написано много статей, но большинство из них посвящено различным «бантикам», «красивостям» и различному функционалу, который востребован в домашних условиях.
В данной статье пойдет речь только о функционале, который может быть востребован среди производителей устройств фиксированного назначения. А именно о новых возможностях режима «Киоск». Также будет затронута тема изменения наименований схем обслуживания редакций Windows корпоративного сегмента.


Старая схема обслуживания с новым названием

Начну с небольшого пояснения, в корпоративном сегменте редакций Windows есть две схемы обслуживания, по которым Windows получает обновления. Схемы обслуживания имеют буквенное обозначение. Сейчас ветки обслуживания называются LTSC и SAC.

LTSC — означает Long Term Servicing Channel (с долгосрочным обслуживанием). Ранее такой канал назывался LTSB — Long Term Servicing Branch, Майкрософт просто изменил название канала обслуживания, само обслуживание осталось прежним.

Также Майкрософт поменял название ветки обслуживания CBB — Current Branch for Business, теперь эта ветка обслуживания называется SAC — Semi-Annual Channel. Опять же поменялось только название.

Но следует упомянуть, что для веток обслуживания 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 HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v KillSysprep /t REG_SZ /d "taskkill /im sysprep.exe" /f
    %SYSTEMROOT%\System32\Sysprep\sysprep.exe /audit /generalize /shutdown /quiet
goto :eof

:OOBE
    call :ShowMessage "‡‡‡‡‡Запечатывание системы в режиме приветствия"
    reg delete HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v KillSysprep /f
    powershell -command "(Get-Content -path 'Unattend.xml' -Raw).Trim() -replace 'Architecture=""".+?"""','Architecture="""%PROCESSOR_ARCHITECTURE%"""' | Set-Content -path 'Unattend.xml'"
    %SYSTEMROOT%\System32\Sysprep\sysprep.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«а.


    
        
            
                
                    reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Setup\OOBE /v SetupDisplayedProductKey /t REG_DWORD /d 1 /f
                    1
                    Dont show key page
                
                
                    reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Setup\OOBE /v UnattendCreatedUser /t REG_DWORD /d 1 /f
                    2
                    Dont make account
                
                
                    cmd.exe /c rd %systemdrive%\Sysprep /s /q
                    3
                    Del Folder
                
            
        
        
            
                true
                Admin
            
        
    
    
        
            en-US; ru-RU
            ru-RU
            ru-RU
            
            ru-RU
        
        
            
                true
                true
                true
                true
                true
                1
            
        
    

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

Теперь я запечатаю систему в режиме аудита с помощью «Sysprep.bat» и сниму образ системы. Снимать образ системы я буду с помощью DISM«а и буду снимать образ только системного тома. Если Вы будете снимать образ только системного тома, а не всего диска, то не забывайте копировать содержимое каталога «Windows\System32\Recovery» на первый том в папку «Recovery\WindowsRE» после разворачивания системы. Это нужно будет сделать до загрузки ОС т.к. после загрузки ОС каталог «Windows\System32\Recovery» уже будет пустым.


Шаг 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
  • Paint
  • WordPad
  • Параметры
  • Безопасность Windows

Последние два приложения были закреплены т.к. в стандартной поставке LTSC других универсальных приложений просто нет. Обратите внимание, что плитки классических приложений ссылаются на ярлыки. Теперь путем передвижения плиток непосредственно в меню «Пуск» я разделю закрепленные плитки на две группы. Для создания новой группы плиток перетащите плитку существенно выше или ниже других плиток, при этом высветиться интуитивно понятный разделитель. Вы можете назвать группы по своему усмотрению, для этого разместите курсор мыши выше группы, а когда появится надпись — «Назвать группу» нажмите левой кнопкой мыши. Первую группу я назову «Настройки», в нее войдут плитки «Параметры» и «Безопасность Windows». Вторую группу я назову «Офисные приложения», в которую войдут все остальные плитки. Кстати, можно перемещать целиком группы плиток, перетаскивая их за две полоски, которые находятся справа вверху от названия группы.

Т.к. на плитке «Безопасность Windows» не умещается название полностью, я изменю ее размер на «Широкий». Для изменения размера плитки нужно нажать на плитке правой кнопкой мыши и выбрать пункт «Изменить размер».

После настройки экспортируем текущее состояние, выполняем команду в среде PowerShell — «Export-StartLayout — path C:\Sysprep\StartLayout.xml».

Дальше проще всего не создавать файл настроек самостоятельно, а отсюда взять пример файла настроек — нажимаем на кнопку «Copy», вставляем содержимое в блокнот и сохраняем как «MultiAppKiosk.xml». Теперь меняем настройки на свои. Для изменения настроек прикрепленных плиток копируем весь блок «StartLayoutCollection» из «StartLayout.xml» в «MultiAppKiosk.xml». Чтобы добавить приложения в разрешенные необходимо вставить идентификаторы универсальных приложений в раздел «AllowedApps» и в этот же блок добавить полный путь к исполняемым файлам классических приложений, который прописан в свойствах ярлыках, на которые ссылаются плитки. Для быстрого перехода к ярлыку, нажмите правой кнопкой мыши на закрепленной плитке и пройдите по меню «Дополнительно > Перейти к расположению файла». Обратите внимание, для указания ID универсального приложения используется параметр «AppUserModelId», а для указания полного пути к классическому приложению используется параметр «DesktopAppPath». И еще один маленький нюанс, если Вы планируете использовать IE в системе x64, то в перечне разрешенных приложений необходимо указать два пути для исполняемого файла «Program Files\Internet Explorer\iexplore.exe» и «Program Files (x86)\Internet Explorer\iexplore.exe».

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

Отображение панели задач мне не помешает, поэтому в секции «Taskbar» оставляю все как есть.

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

В секции «Configs» учетные записи привязаны к профилям, обратите внимание, что к одному профилю можно привязать множество учетных записей. Но т.к. меня интересует только одна учетная запись, то я удалю все привязки кроме первой — блоки «Config». В оставшейся привязке пропишу имя пользователя «User».

У меня получился вот такой файл с параметрами


MultiAppKiosk.xml


  
      
          
              
                  
                  
                  
                  
                  
                  
                  
              
          
          
              
                    
                    
                      
                        
                          
                            
                            
                          
                          
                            
                            
                            
                            
                            
                          
                        
                      
                    
                  
              ]]>
          
          
      
  
  
      
          User
          
      
  

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


Шаг 6 — применение настроек мультикиоска

Рассмотрим два способа применения настроек, описанных в конфигурационном файле. Первый — с помощью пакета подготовки, который нужно создавать в ICD. Для кого-то, возможно, такой способ будет более привычным. Второй — с использованием «MDM Bridge WMI Provider», этот способ мне показался более удобным.


Способ №1

У кого нет ICD, скачиваем ADK и устанавливаем. Установка ADK очень простая, набор компонентов можно оставить по умолчанию.

Запускаем ICD, нажимаем на плитку «Дополнительная подготовка», указываем имя и папку проекта и нажимаем «Далее». В следующем окне выбираем «Все выпуски Windows для настольных компьютеров» и нажимаем «Далее». Импорт пакета подготовки можно пропустить, нажимаем «Готово».

Раскрываем выпадающее меню «Параметры среды выполнения», далее раскрываем подменю «AssignedAccess» и выбираем пункт «MultiAppAssignedAccessSettings». В верхней части средней секции окна ICD нажимаем кнопку «Обзор» и указываем расположение XML-файла с настройками. На всякий случай можно сохранить проект нажав «Ctrl+s». В левой верхней части ICD выбираем «Экспорт» в выпадающем меню выбираем пункт «Пакет подготовки». В качестве владельца выбираем «ИТ-администратор» все остальные вопросы можно пропустить, нажимая «Далее» и в конце нажимаем «Сборка» и «Готово».

В установленной системе не забываем создать пользователя «User», его нельзя добавлять в группу «Администраторы» иначе мультикиоск работать не будет. Я создал пользователя в оснастке «Управление компьютером» с неограниченным сроком действия пароля.

Теперь запускаем пакет подготовки в ранее установленной системе. После применения пакета подготовки изменится меню пуск и у администратора. В левом столбце пуска должны исчезнуть кнопки: «Документы», «Изображение», «Параметры». Если меню пуск не изменилось, то что-то пошло не так. Установленный пакет можно удалить если открыть окно «Параметры > Учетные записи > Доступ к учетной записи места работы или учебного заведения > Добавление или удаление пакета подготовки».

Если меню пуск изменилось, то настройки применены к системе, заходите под пользователем, для которого настроен мультикиоск и посмотрите на результат.


Способ №2

Применение настроек с помощью «MDM 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%\Software\Sysinternals\PsExec /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="root\cimv2\mdm\dmmap"
$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


  
      
          
              
                  
                  
                  
                  
                  
                  
                  
              
          
          
              
                    
                    
                      
                        
                          
                            
                            
                          
                          
                            
                            
                            
                            
                            
                          
                        
                      
                    
                  
              ]]>
          
          
      
  
  
      
          User
          
      
  

Немного об особенностях скрипта. Скрипт рассчитан на использование 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», до

© Habrahabr.ru