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 - азначае Long Term Servicing Channel (з доўгатэрміновым абслугоўваннем). Раней такі канал называўся LTSB - Long Term Servicing Branch, Майкрасофт проста змяніў назву канала абслугоўвання, само абслугоўванне засталося ранейшым.

Таксама Майкрасофт памяняў назву галіны абслугоўвання 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.

Майкрасофт варта свайму плану - паступоваму перакладу налад з класічнага меню ў новае, таму ў класічнай панэлі кіравання Вы ўжо не знойдзеце налад для змены мовы і ўсталёўкі моўнага пакета. Дадзеныя наладкі зараз толькі ў параметрах сістэмы.

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

Але ў параметрах сістэмы Вы можаце ўсталяваць моўны пакет, калі сістэма падлучаная да інтэрнэту, там няма магчымасці выбару ўсталёўкі моўнага пакета з лакальнага файла.

Не буду апісваць працэс лакалізацыі сістэмы т.я. гэта істотна абцяжарыць артыкул, тым больш што працэс лакалізацыі падрабязна апісаны тут. Але жадалася б звярнуць Вашу ўвагу на асаблівасць змены мовы сістэмы пасля ўсталёўкі моўнага пакета з дапамогай кансолі. Дадзеная асаблівасць апісана ў той жа вікі, на якую я даў спасылку раней, у падраздзеле «Даданне мовы ў спіс моў».

Я ўсталюю моўны пакет без падлучэння да інтэрнэту.

Пасля поўнай лакалізацыі сістэмы абавязкова стварыце выяву сістэмы.

Крок 4 - ўстаноўка неабходных прыкладанняў

Т.к. у сістэмах LTSB і LTSC няма крамы прыкладанняў, то ўсталёўка прыкладанняў з "Microsoft Store" выклікае некаторыя цяжкасці, а менавіта - загрузка прыкладання. Для загрузкі прыкладанняў кампанія "Adguard" зрабіла вельмі зручны сэрвіс – "Adguard Store", з дапамогай якога можна атрымаць часовыя спасылкі на загрузку прыкладанняў і іх кампанентаў.

Для ўсталёўкі прыкладання Вам спатрэбяцца файлы з пашырэннямі "Appx" і "AppxBundle". Перад усталёўкай самога прыкладання неабходна ўсталяваць яго кампаненты. Як правіла кампаненты ад прыкладання можна інтуітыўна адрозніць па назове файла.

Каб не рабіць артыкул занадта вялікі не буду падрабязна апісваць працэс усталёўкі прыкладанняў, тым больш што па ўсталёўцы ёсць падрабязная інструкцыя. Але дадам яшчэ адзін спосаб усталёўкі прыкладанняў у бягучы ўліковы запіс. Прыкладанні можна ўсталяваць з дапамогай праграмы "App Installer", але для ўсталёўкі прыкладанняў запатрабуецца падлучэнне да інтэрнэту, затое прыкладанні можна будзе ўсталяваць падвойнай пстрычкай мышы і вам не спатрэбяцца яго кампаненты, усе неабходныя кампаненты загрузіць і ўсталюе "App Installer".

І невялікі напамін, пры ўсталёўцы прыкладання ў бягучы ўліковы запіс нельга будзе запячатаць сістэму. Як усталяваць прыкладанні каб была магчымасць запячатаць сістэму гледзіце ў вышэйзгаданай інструкцыі. А для праверкі працы мульцікіёска цалкам хопіць ужо наяўных прыкладанняў.

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

Вось мы і дабраліся да самага цікавага - да налады рэжыму кіёска. Глядзім у інструкцыю па наладзе і бачым. Першым чынам нам спатрэбіцца стварыць канфігурацыйны XML-файл, поўны прыклад якога можна паглядзець тут.

Пачнём з налады размяшчэння плітак. Самы просты спосаб стварэння XML-канфігурацыі налады плітак экспарт іх бягучага стану.

Перш за ўсё дадамо ў меню «Пуск» пліткі тых прыкладанняў, якія нам патрэбныя. Выклікаем пошук «Win+s», знаходзім патрэбны дадатак, націскаем на ім правай кнопкай мышы і выбіраемы пункт «Замацаваць на пачатковым экране».

Я замацаваў наступныя прыкладанні:

  • нататнік
  • калькулятар
  • інтэрнэт эксплорер
  • Фарба
  • 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. Для кагосьці, магчыма, такі спосаб будзе больш звыклым. Другі з выкарыстаннем "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%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