Windows 10 IoT Enterprise 2019 — tryb wielokiosku

Wprowadzenie

Windows 10 IoT Enterprise 2019 – to marketingowa nazwa kolejnej wersji Windows 10. Wydanie tej wersji ogłoszono we wrześniu 2018 roku, więc ma wersję 1809, gdzie 18 oznacza rok, a 09 miesiąc. Na temat nowej wersji Windows 10 1809 napisano wiele artykułów, jednak większość z nich dotyczy różnych „ulepszeń”, „atrakcyjności” oraz funkcjonalności, które są przydatne w warunkach domowych.
W tym artykule omówimy wyłącznie funkcjonalność, która może być przydatna dla producentów urządzeń do zastosowań stałych. A mianowicie nowe możliwości trybu „Kiosku”. Poruszymy również temat zmiany nazw schematów wsparcia edycji Windows w segmencie korporacyjnym.

Stary schemat wsparcia z nową nazwą

Zacznę od krótkiego wyjaśnienia: w segmencie korporacyjnym edycji Windows istnieją dwa schematy wsparcia, na podstawie których Windows otrzymuje aktualizacje. Schematy wsparcia mają oznaczenie literowe. Obecnie nazywane są LTSC i SAC.

LTSC – oznacza Long Term Servicing Channel (kanal długoterminowego wsparcia). Wcześniej ten kanał nazywał się LTSB – Long Term Servicing Branch. Microsoft po prostu zmienił nazwę kanału wsparcia, samo wsparcie pozostało bez zmian.

Microsoft zmienił również nazwę gałęzi wsparcia CBB – Current Branch for Business, teraz ta gałąź wsparcia nazywa się SAC – Semi-Annual Channel. Znowu zmieniła się tylko nazwa.

Należy jednak zauważyć, że dla gałęzi wsparcia LTSC i SAC używane są różne dystrybucje Windows.

Trochę o nowym trybie kiosku w SAC

Jak już wspomniałem, LTSC i SAC mają różne dystrybucje. LTSC nie ma standardowych aplikacji uniwersalnych ani sklepu z aplikacjami, natomiast SAC je ma. W konsekwencji w LTSC nie ma przeglądarki Edge, a w SAC jest. Jeśli podczas ustawiania kiosku wybierzesz przeglądarkę Edge, to teraz dostępne są dwa tryby:

  1. Jako znak cyfrowy lub interaktywny wyświetlacz
  2. Jako publiczna przeglądarka

Nie będę zatrzymywał się na ustawieniu tych trybów, ponieważ konfiguracja jest bardzo prosta i odbywa się w interfejsie graficznym. Po prostu stwórz użytkownika, który nie należy do grupy „Administratorzy”, włącz dla niego tryb kiosku używając EDGE i zobacz, jak te tryby działają.

Kiosk z wieloma aplikacjami

Niektórzy myślą, że licencjonowane użycie Windows 10 IoT Enterprise zakłada działanie tylko jednej aplikacji na urządzeniu, ale w rzeczywistości nie jest to prawda. Urządzenie powinno być przeznaczone do wykonywania jednego zadania biznesowego i użytkownik nie powinien mieć dostępu do pulpitu. Teraz Microsoft sam udostępnił narzędzie do korzystania z wielu aplikacji. Tryb ten nazywa się „multi-app kiosk”, na potrzeby tego artykułu będę go nazywał „mulkiosk”. W tym artykule omówimy konfigurację tego trybu za pomocą pakietu oprogramowania oraz niektóre cechy tego trybu.

Kilka słów o trybie „Mulkiosk”

Po zalogowaniu się na konto użytkownika, dla którego skonfigurowano tryb mulkiosku, system będzie działał w trybie tabletu. Menu „Start” będzie rozciągnięte na pełny ekran, na którym będą wyświetlane kafelki aplikacji.

Lista podstawowych ustawień i możliwości trybu:

  1. Konfiguracja dla wielu użytkowników lub grup
  2. Każdemu użytkownikowi lub grupie można przypisać indywidualne ustawienia
  3. Możliwość korzystania z aplikacji uniwersalnych i klasycznych
  4. Możliwość automatycznego uruchamiania jednej z aplikacji po zalogowaniu się użytkownika do systemu
  5. Działanie aplikacji na podstawie białej listy
  6. Dostęp do folderów na podstawie białej listy

Warto zwrócić uwagę na punkt 5. Domyślnie dozwolone będzie działanie tylko tych aplikacji, które są niezbędne do działania systemu, pozostałe aplikacje należy dodać do listy dozwolonych. To znaczy, że teraz nie trzeba osobno konfigurować AppLocker. Swoją drogą, aby uniknąć konfliktu ustawień AppLocker, w trybie mulkiosku wszystkie skonfigurowane zasady AppLocker nie będą obowiązywać.

W punkcie 6 wskazano dobrą możliwość, ale w tej chwili można zezwolić na zapis tylko dla folderu „Downloads”. Tryb pozwala na korzystanie z aplikacji uniwersalnych i klasycznych. Wszystkie ustawienia trybu są wskazywane w pliku XML, w którym można również wskazać ustawienia dla kiosku z jedną aplikacją.

A teraz spróbujmy to wszystko skonfigurować...

Czego będziemy potrzebować...

  1. Przede wszystkim potrzebujemy samego systemu, który obsługuje tryb mulkiosk. Tutaj można pobrać wersję demonstracyjną
  2. Instrukcja konfiguracji mulkiosku
  3. Dowolny edytor XML
  4. Aby zastosować ustawienia mulkiosku:
    1. Dla metody nr 1 — ICD, która jest częścią ADK. ADK można pobierz tutaj
    2. Dla metody nr 2 – narzędzie PsExec. Narzędzie można pobierz tutaj

On powiedział – „Jedziemy!”

Wszystkie eksperymenty będę prowadził na Windows 10 IoT Enterprise 1809 LTSC x32 w wersji komercyjnej, a nie demonstracyjnej. System będzie bez aktywacji, ponieważ brak aktywacji nie wpływa na funkcjonalność systemu. Wybrałem 32 bity tylko dlatego, że zajmuje mniej miejsca i praca z obrazami systemu będzie szybsza.

Krok 1 – instalacja

Instalacja Win 10 IoT Enterprise nie różni się od instalacji Win 10 Enterprise, dlatego nie będę opisywał całego procesu instalacji, powiem tylko o niektórych szczegółach.

Przypominam, aby nie instalować systemu na już zainstalowanym. Kiedy instalator zapyta o miejsce instalacji systemu, usuń wszystkie partycje na przyszłym dysku systemowym i wskaż nieprzydzielony dysk.

Instalujemy system bez podłączenia do Internetu, aby system nie pobrał niczego dodatkowego.

Ponieważ będziemy tworzyć kopie zapasowe systemu i będziemy go zamykać w trybie audytu, można zaoszczędzić trochę czasu, uruchamiając system w trybie audytu od razu po instalacji. W tym celu, gdy system poprosi o wybór regionu „Zacznijmy od regionu. Czy to odpowiednie?”, po prostu naciśnij „Ctrl+Shift+F3”.

Krok 2 – tworzymy obraz systemu

Ponieważ będziemy eksperymentować z systemem, próbując różnych nowych ustawień, nie wykluczone, że coś pójdzie nie tak i trzeba będzie przywrócić system do pierwotnego stanu. Aby szybko przywrócić system do stanu początkowego, muszę utworzyć obraz systemu. Jedyna rzecz, którą zrobię, to skopiuję „zestaw dżentelmena” – skrypt i plik odpowiedzi. Wszystkie pliki mam w folderze „Sysprep”, który skopiuję do katalogu głównego dysku systemowego. Oczywiście podzielę się z Wami tym „zestawem dżentelmena”.

Sysprep.bat – do zamykania systemu.

@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 minName%>nul 2>nul
if %errorLevel% neq 0 (call :AddAdmin "minName%")
if %errorLevel% neq 0 (call :ShowMessage "***Błąd utworzenia nowego konta administratora "minName%"*** Naciśnij dowolny klawisz, aby zakończyć skrypt"&pause>nul&exit)

pushd "%~dp0"

cls
call :ShowMessage **********
echo 1 - Wykonaj sysprep w trybie audytu
echo 2 - Wykonaj sysprep w trybie powitanian
:Select
set /p Choice="Wprowadź numer opcji menu: "
if "%Choice%"=="1" (goto Audit)
if "%Choice%"=="2" (goto OOBE)
echo.&echo Wybrano niedozwoloną wartość.&goto Select

exit

:Audit
 call :ShowMessage "*****Wykonywanie sysprep w trybie audytu"
 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 "*****Wykonywanie sysprep w trybie powitania"
 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 Nie podano nazwy użytkownika&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 minGroup% %UserName% /add
 net localgroup %UserGroup% %UserName% /delete
 endlocal&exit /b 0
goto :eof

:GetGroupName
 if "%~1"=="" (echo Nie podano SID grupy&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 Błąd określenia nazwy grupy na podstawie 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

Przy uruchomieniu skrypt sprawdzi istnienie konta „Admin” i utworzy je, jeśli go nie ma. Konto zostanie dodane do grupy „Administratorzy“.

Unattend.xml – plik odpowiedzi dla sysprep'a.

reg add HKLMSoftwareMicrosoftWindowsCurrentVersionSetupOOBE /v SetupDisplayedProductKey /t REG_DWORD /d 1 /f
                    1
                    Nie pokazuj strony z kluczem
                
                
                    reg add HKLMSoftwareMicrosoftWindowsCurrentVersionSetupOOBE /v UnattendCreatedUser /t REG_DWORD /d 1 /f
                    2
                    Nie twórz konta
                
                
                    cmd.exe /c rd %systemdrive%Sysprep /s /q
                    3
                    Usuń folder
                
            
        
        
            
                true
                Admin
            
        
    
    
        
            en-US; pl-PL
            pl-PL
            pl-PL
            
            pl-PL
        
        
            
                true
                true
                true
                true
                true
                1

Podczas przygotowania w trybie audytu skrypt doda do rejestru polecenie zakończenia procesu „sysprep.exe”, aby za każdym razem nie zamykać okna sysprep ręcznie. Przygotowując w trybie powitalnym, skrypt usunie z rejestru polecenie zamknięcia okna i zmieni również wartość architektury w pliku odpowiedzi na bieżącą. W pliku odpowiedzi znajdują się parametry do uruchomienia systemu bez udziału użytkownika oraz polecenie do usunięcia folderu „Sysprep” z głównego dysku systemowego.

Teraz zapakuję system w trybie audytu za pomocą „Sysprep.bat” i utworzę obraz systemu. Będę tworzyć obraz systemu przy użyciu DISM i utworzę obraz tylko partycji systemowej. Jeśli będziesz tworzyć obraz tylko partycji systemowej, a nie całego dysku, to nie zapomnij skopiować zawartości katalogu „WindowsSystem32Recovery” na pierwszą partycję do folderu „RecoveryWindowsRE” po rozruchu systemu. Należy to zrobić przed uruchomieniem systemu operacyjnego, ponieważ po załadowaniu systemu katalog „WindowsSystem32Recovery” będzie już pusty.

Krok 3 – lokalizacja systemu

Pakiet językowy można zainstalować bez połączenia z internetem, jeśli ten pakiet już posiadasz. Jeśli nie, system sam go pobierze z internetu, gdy dodasz język w ustawieniach. Tylko nie używaj pakietu językowego z poprzednich wersji systemu operacyjnego. Dla systemu Windows 10 1809 musi być pakiet językowy specjalnie dla Windows 10 1809.

Microsoft podąża za swoim planem – stopniowym przenoszeniem ustawień z klasycznego menu do nowego, dlatego w klasycznej panelu sterowania nie znajdziesz już ustawień do zmiany języka i instalacji pakietu językowego. Te ustawienia są teraz tylko w parametrach systemu.

W trybie audytu możesz napotkać problem z otwieraniem ustawień systemu z menu „Start”, aby otworzyć ustawienia systemu, wpisz polecenie – „ms-settings:”, zwróć uwagę na dwukropek na końcu polecenia, bez niego polecenie nie zadziała. Po jednokrotnym otwarciu ustawień systemu za pomocą tego polecenia, będzie można je otworzyć za pomocą graficznego menu.

Jednak w ustawieniach systemu możesz zainstalować pakiet językowy, jeśli system jest podłączony do internetu, nie ma możliwości wyboru instalacji pakietu językowego z lokalnego pliku.

Nie będę opisywał procesu lokalizacji systemu, ponieważ znacznie obciążyłoby to artykuł, tym bardziej że proces lokalizacji został szczegółowo opisany tutaj. Chciałbym jednak zwrócić uwagę na szczególną cechę zmiany języka systemu po zainstalowaniu pakietu językowego za pomocą konsoli. Ta cecha została opisana w tej samej wiki, do której podałem link wcześniej, w podrozdziale „Dodawanie języka do listy języków”.

Zainstaluję pakiet językowy bez połączenia z internetem.

Po pełnej lokalizacji systemu koniecznie utwórz obraz systemu.

Krok 4 – instalacja niezbędnych aplikacji

Ponieważ w systemach LTSB i LTSC nie ma sklepu z aplikacjami, instalacja aplikacji z „Microsoft Store” sprawia pewne trudności, a mianowicie – pobieranie aplikacji. Aby pobrać aplikacje, firma „Adguard” stworzyła bardzo wygodną usługę – „Adguard Store”, za pomocą której można uzyskać tymczasowe linki do pobierania aplikacji i ich komponentów.

Aby zainstalować aplikację, potrzebne będą pliki z rozszerzeniami „Appx” i „AppxBundle”. Przed instalacją samej aplikacji należy zainstalować jej komponenty. Z reguły komponenty aplikacji można intuicyjnie odróżnić po nazwie pliku.

Aby nie wydłużać artykułu, nie będę szczegółowo opisywał procesu instalacji aplikacji, tym bardziej że w kwestii instalacji jest szczegółowa instrukcja. Zaznaczę jednak jeszcze jeden sposób instalacji aplikacji na bieżące konto. Aplikacje można zainstalować za pomocą programu „App Installer”, ale do instalacji aplikacji wymagane będzie połączenie z internetem, jednak aplikacje można będzie zainstalować dwuklikiem myszki, a wszystkie niezbędne komponenty zostaną pobrane i zainstalowane. „App Installer”.

I małe przypomnienie: podczas instalacji aplikacji na bieżące konto nie będzie można zapieczętować systemu. Jak zainstalować aplikacje, aby móc zapieczętować system, patrz w wyżej wymienionej instrukcji. A do sprawdzania działania multikiosków wystarczą już istniejące aplikacje.

Krok 5 – tworzenie pliku konfiguracyjnego dla multikiosków

Oto dotarliśmy do najciekawszego – do konfigurowania trybu kiosku. Patrzymy w instrukcję konfiguracyjną i widzimy. Przede wszystkim będziemy potrzebować stworzyć plik XML konfiguracyjny, pełny przykład którego można zobacz tutaj.

Zaczniemy od ustawienia lokalizacji kafelków. Najprostszym sposobem na stworzenie konfiguracji XML dla ustawień kafelków jest eksport ich bieżącego stanu.

Na początek dodamy do menu "Start" kafelki tych aplikacji, które są nam potrzebne. Wywołujemy wyszukiwanie "Win+s", znajdujemy potrzebną aplikację, klikamy na niej prawym przyciskiem myszy i wybieramy „Przypnij do ekranu startowego”.

Przypiąłem następujące aplikacje:

  • Notatnik
  • Kalkulator
  • Internet Explorer
  • Paint
  • WordPad
  • Ustawienia
  • Bezpieczeństwo systemu Windows

Ostatnie dwa aplikacje zostały przypięte, ponieważ w standardowej wersji LTSC nie ma innych uniwersalnych aplikacji. Zauważ, że kafelki klasycznych aplikacji odnoszą się do skrótów. Teraz, przenosząc kafelki bezpośrednio w menu "Start", podzielę przypięte kafelki na dwie grupy. Aby utworzyć nową grupę kafelków, przeciągnij kafelek znacznie wyżej lub niżej niż inne kafelki, a pojawi się intuicyjny separator. Możesz nazwać grupy według własnego uznania, w tym celu umieść kursor myszy nad grupą, a gdy pojawi się napis - „Nazwij grupę”, kliknij lewym przyciskiem myszy. Pierwszą grupę nazwę „Ustawienia”, wejdą w nią kafelki „Ustawienia” i „Bezpieczeństwo systemu Windows”. Drugą grupę nazwę „Aplikacje biurowe”, w którą wejdą wszystkie pozostałe kafelki. Swoją drogą, można przenosić całe grupy kafelków, przeciągając je za dwie paski, które znajdują się w prawym górnym rogu tytułu grupy.

Ponieważ na kafelku „Bezpieczeństwo systemu Windows” nie mieści się całe nazwa, zmienię jego rozmiar na „Szeroki”. Aby zmienić rozmiar kafelka, należy kliknąć prawym przyciskiem myszy na kafelku i wybrać „Zmień rozmiar”.

Po skonfigurowaniu eksportujemy bieżący stan, wykonując polecenie w środowisku PowerShell - „Export-StartLayout – path C:SysprepStartLayout.xml”.

Następnie najprościej nie tworzyć pliku konfiguracyjnego samodzielnie, lecz wziąć przykład pliku stąd Ustawienia – klikamy przycisk „Copy”, wklejamy zawartość do notatnika i zapisujemy jako „MultiAppKiosk.xml”. Teraz zmieniamy ustawienia na swoje. Aby zmienić ustawienia przypiętych kafelków, kopiujemy cały blok „StartLayoutCollection” z „StartLayout.xml” do „MultiAppKiosk.xml”. Aby dodać aplikacje do dozwolonych, należy wstawić identyfikatory aplikacji uniwersalnych do sekcji „AllowedApps”, a w tym samym bloku dodać pełną ścieżkę do plików wykonywalnych klasycznych aplikacji, która jest określona w właściwościach skrótów, na które wskazują kafelki. Aby szybko przejść do skrótu, kliknij prawym przyciskiem myszy na przypiętym kafelku i przejdź do menu „Dodatkowo > Przejdź do lokalizacji pliku”. Zwróć uwagę, że do wskazania ID aplikacji uniwersalnej używa się parametru „AppUserModelId”, a do wskazania pełnej ścieżki do klasycznej aplikacji używa się parametru „DesktopAppPath”. I jeszcze jedna mała uwaga, jeżeli planujesz używać IE w systemie x64, to w wykazie dozwolonych aplikacji musisz wskazać dwie ścieżki do pliku wykonywalnego „Program Files\Internet Explorer\iexplore.exe” oraz „Program Files (x86)\Internet Explorer\iexplore.exe”.

Dostępu do folderów nie udzielę, dlatego usuwam sekcję „FileExplorerNamespaceRestrictions”.

Wyświetlenie paska zadań mi nie przeszkadza, więc w sekcji „Taskbar” zostawiam wszystko bez zmian.

W przykładzie zapisano dwa profile, ale ja będę miał tylko jeden profil, więc sekcję z drugim profilem można usunąć. Przed usunięciem zwróć uwagę na przykład automatycznego uruchamiania aplikacji z argumentami.

W sekcji „Configs” konta są przypisane do profili, zwróć uwagę, że do jednego profilu można przypisać wiele kont. Jednak ponieważ interesuje mnie tylko jedno konto, usunę wszystkie przypisania oprócz pierwszego – bloki „Config”. W pozostałym przypisaniu wpiszę nazwę użytkownika „User”.

Otrzymałem taki plik z parametrami

MultiAppKiosk.xml

<![CDATA[
                    
                    
                      
                        
                          
                            
                            
                          
                          
                            
                            
                            
                            
                            
                          
                        
                      
                    
                  ]]>
          
          
      
  
  
      
          User

Podczas tworzenia plików XML ustawień pamiętaj, że każdy profil musi mieć unikalny identyfikator, który nie może się powtarzać nie tylko w obrębie jednego pliku XML, ale również w obrębie jednego systemu operacyjnego. Aby się nie pogubić, najlepiej za każdym razem tworzyć nowy identyfikator, co można zrobić w środowisku PowerShell za pomocą komendy „[guid]::NewGuid()”. Upewnij się również, że plik jest zapisany w kodowaniu „UTF-8”, ponieważ jeśli plik zostanie zapisany w kodowaniu „ANSI”, to podczas tworzenia pakietu przygotowawczego pojawi się błąd, jeśli w pliku XML będą znaki cyrylicy.

Krok 6 – stosowanie ustawień multiosków

Rozważmy dwa sposoby zastosowania ustawień opisanych w pliku konfiguracyjnym. Pierwszy – za pomocą pakietu przygotowawczego, który należy stworzyć w ICD. Dla niektórych to może być bardziej znajomy sposób. Drugi – przy użyciu „MDM Bridge WMI Provider”, ten sposób wydaje mi się wygodniejszy.

Sposób nr 1

Jeśli nie masz ICD, pobierz ADK i zainstaluj. Instalacja ADK jest bardzo prosta, możesz pozostawić domyślny zestaw komponentów.

Uruchamiamy ICD, klikamy na kafelek „Dodatkowe przygotowanie”, podajemy nazwę i folder projektu, a następnie klikamy „Dalej”. W następnym oknie wybieramy „Wszystkie wersje systemu Windows dla komputerów stacjonarnych” i klikamy „Dalej”. Import pakietu przygotowawczego możemy pominąć, klikając „Gotowe”.

Rozwiń menu rozwijane „Parametry środowiska wykonawczego”, następnie rozwiń podmenu „AssignedAccess” i wybierz „MultiAppAssignedAccessSettings”. W górnej części środkowej sekcji okna ICD kliknij przycisk „Przeglądaj” i wskaż lokalizację pliku XML z ustawieniami. Dla pewności możesz zapisać projekt, naciskając „Ctrl+s”. W lewym górnym rogu ICD wybierz „Eksportuj”, a w menu rozwijanym wybierz „Pakiet przygotowawczy”. Jako właściciela wybierz „Administrator IT”, wszystkie inne pytania możemy pominąć, klikając „Dalej”, a na końcu klikamy „Buduj” i „Gotowe”.

W zainstalowanym systemie pamiętaj, aby utworzyć użytkownika „User”, nie można go dodawać do grupy „Administratorzy”, w przeciwnym razie multiosk nie będzie działał. Utworzyłem użytkownika w narzędziu „Zarządzanie komputerem” z nieograniczonym czasem trwania hasła.

Teraz uruchamiamy pakiet przygotowawczy w wcześniej zainstalowanym systemie. Po zastosowaniu pakietu przygotowawczego menu startowe oraz konto administratora ulegną zmianie. W lewym kolumnie menu startowego powinny zniknąć przyciski: „Dokumenty”, „Obrazy”, „Ustawienia”. Jeśli menu startowe się nie zmieniło, coś poszło nie tak. Zainstalowany pakiet można usunąć, otwierając okno „Ustawienia > Konto > Dostęp do konta w miejscu pracy lub nauki > Dodawanie lub usuwanie pakietu przygotowawczego”.

Jeśli menu startowe się zmieniło, to ustawienia zostały zastosowane do systemu, zaloguj się jako użytkownik, dla którego skonfigurowano multilok, i sprawdź rezultat.

Metoda nr 2

Zastosowanie ustawień za pomocą „Provider WMI MDM Bridge” opisane tutaj. Wygodą tej metody jest elastyczność użycia i możliwość pozbycia się wielu ręcznych operacji potrzebnych do utworzenia pakietu przygotowawczego. Tutaj każdy może samodzielnie opracować rozwiązanie, które będzie dla niego wygodne. Ja stworzyłem dla siebie taki zestaw skryptów.

MiltiKiosk.bat – skrypt do uruchamiania

@echo off
chcp 1251>nul

if not exist "%~dp0psexec.exe" call :ShowMessage "‡‡‡‡‡‡‡‡‡‡‡‡‡Aby uruchomić skrypt, wymagany jest plik psexec.exe‡‡Aby zakończyć działanie skryptu, naciśnij dowolny klawisz"&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 Nie znaleziono plików PS zaczynających się od - "%~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 – główny skrypt

Funkcja 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, ''}
}

Funkcja ShowMessage ($Message='', $Align=0) {
    Try {$Align = [decimal]$Align} Catch {Return 'Dla parametru Align można podać tylko liczbę' | 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, 'Błąd przy pobieraniu obiektu ustawień', 2, 'Naciśnij "Enter", aby zakończyć działanie skryptu') -Align 2; Read-Host; Exit}

Funkcja MainMenu() {
    ShowMessage (13, ' 0 - Wyjście', ' 1 - Wybierz plik XML do instalacji', ' 2 - Pokaż bieżącą konfigurację multi-kiosku', ' 3 - Usuń ustawienia multi-kiosku', 1)
    $local:PromptText = 'Wybierz działanie'
    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, 'Rozpoczęcie konfiguracji') -Align 2; Write-Host $MultiAppKiosk.Configuration; ShowMessage -Message ('Koniec konfiguracji', 1, 'Aby wrócić do menu naciśnij "Enter"', 1) -Align 2; Read-Host}
            3 {$MultiAppKiosk.Configuration = $Null; Set-CimInstance -CimInstance $MultiAppKiosk; ShowMessage -Message (1, 'Udało się usunąć ustawienia', 1) -Align 2}
            DEFAULT {ShowMessage 'Wybrana wartość jest niedozwolona'}
        }
        if ($Selections -contains $Select) {Clear-Host; ShowMessage (15, ' 0 - Wyjście', ' 1 - Wybierz plik XML do instalacji', ' 2 - Pokaż bieżącą konfigurację multi-kiosku', ' 3 - Usuń ustawienia multi-kiosku', 1)}
    }
}

Funkcja XMLSelection() {
    Clear-Host

    if (!(Test-Path -Path $PSScriptRoot'XML')) {ShowMessage -Message (13, 'Nie znaleziono katalogu', $('"'+$PSScriptRoot+'XML"'), 1, 'Naciśnij "Enter", aby wrócić do poprzedniego menu') -Align 2; Read-Host; Return}

    $local:XMLList = @()
    $XMLList += Get-ChildItem -Path $PSScriptRoot'XML' -name -filter '*.xml'
    if ($XMLList.Count -eq  0) {ShowMessage -Message (13, 'Nie znaleziono plików XML w katalogu', $('"'+$PSScriptRoot+'XML"'), 1, 'Naciśnij "Enter", aby wrócić do poprzedniego menu') -Align 2; Read-Host; Return}

    [int]$local:Indent = 13 - $XMLList.Count / 2; if ($Indent -lt 1) {$Indent = 1}
    ShowMessage ($Indent, ' 0 - Wróć do poprzedniego menu')
    for ($i=0; $i -le $XMLList.GetUpperBound(0); $i++) {Write-Host $(' '+($i+1)+' - '+$XMLList[$i])}
    Write-Host
    $local:PromptText = 'Wybierz plik do instalacji'
    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 $('Dano polecenie zastosowania ustawień z pliku '+$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 ('Wybrana wartość jest niedozwolona')} 
        }
    }
}

MainMenu

Jeśli chcesz skorzystać z mojego rozwiązania, zapisz wspomniane skrypty w jednym folderze pod ich oryginalnymi nazwami, a do tego samego folderu umieść plik „PsExec.exe”. W tym samym folderze stwórz folder „XML” i skopiuj do niego pliki XML do konfiguracji multikoska. Będę używać tego samego pliku, co w pierwszej metodzie.

MultiAppKiosk.xml

<![CDATA[
                    
                    
                      
                        
                          
                            
                            
                          
                          
                            
                            
                            
                            
                            
                          
                        
                      
                    
                  ]]>
          
          
      
  
  
      
          User

Kilka słów na temat specyfiki skryptu. Skrypt jest zaprojektowany do użycia plików XML z kodowaniem „UTF8”, jeśli chcesz używać kodowania „ANSI”, usuń z parametru odczytu pliku parametr „encoding UTF8”. Do folderu „XML” należy umieścić pliki XML bez zamiany znaków, skrypt samocześnie wymieni znaki specjalne na odpowiednie oznaczenia. Aby nie pogubić się w GUID-ach przypisania użytkowników do profili, możesz po prostu podać numer lub nazwę użytkownika w nawiasach klamrowych, cała zawartość w nawiasach klamrowych zostanie zastąpiona GUID-ami.

Użycie skryptu jest bardzo proste, uruchom go i wybierz potrzebną opcję. Aby zmienić bieżącą konfigurację na nową, nie musisz usuwać aktualnej, zostanie ona nadpisana. Nie zapominaj, aby tworzyć użytkowników zapisanych w pliku konfiguracyjnym.

Podczas przeglądania bieżącej konfiguracji multikoska w tej samej sesji, w której została zastosowana, zamiast znaków specjalnych będą wyświetlały się kombinacje zastępczych symboli. Po zmianie sesji (ponownym uruchomieniu skryptu), wszystkie znaki specjalne będą wyświetlane w oryginalnej formie.

Krok 7 – zapieczętowanie systemu

Multikiosk działa, no i to wszystko, zdawałoby się...

Jeśli wszystko idzie zgodnie z planem, oznacza to, że czegoś nie zauważasz.

Nie zapominajmy, że musimy również przetłumaczyć system z trybu audytu na tryb powitania. Jesteśmy na to gotowi, uruchamiamy „Sysprep.bat”, wybieramy punkt 2, system jest zapieczętowywany. Włączamy urządzenie, system uruchamia się, logujemy się na konto użytkownika, dla którego skonfigurowano multikiosk i nie możemy się zalogować. Po napisie „Witaj” pojawia się napis „Wylogowanie się”.

Na początku chciałem opisać tylko rozwiązanie problemu, ale później postanowiłem przedstawić kroki identyfikacji problemu oraz znalezienia najprostszego rozwiązania, ponieważ na pewno wielu czytelników będzie dręczyć niepewność – „A jeśli tak…”. Myślę, że opis różnych eksperymentów zaoszczędzi wam znaczną ilość czasu, jeśli zechcecie znaleźć inne rozwiązanie. Aby informacja była jak najbardziej precyzyjna, a by jeszcze raz upewnić się o braku jakichkolwiek błędów, opis eksperymentów będę prowadził w formacie „zrobiłem – zanotowałem”. To znaczy, że jeszcze raz przeprowadzę opisane eksperymenty.

Eksperymenty

Co nam z tego wyszło. W systemie są dwa konta:

„Admin” – w grupie „Administratorzy”
„User” – w grupie „Użytkownicy”
W trybie audytu multikiosk działał, po zapieczętowaniu – nie działa.

Eksperyment 1

Usuwamy zainstalowany pakiet przygotowawczy, w narzędziu „Zarządzanie komputerem” usuwamy użytkownika „User” i tworzymy nowego użytkownika o nazwie „User”, stosujemy pakiet przygotowawczy, wchodzimy na konto „User” – nie działa. Logujemy się jako „Admin”, usuwamy użytkownika „User” z grupy „Użytkownicy”, dodajemy do grupy „Administratorzy”, logujemy się jako „User” – nie działa. Logujemy się jako „Admin”, usuwamy pakiet przygotowawczy z multikiosku, logujemy się jako „User” – udało się zalogować, ale naturalnie tryb multikiosku nie działa, ponieważ pakiet przygotowawczy został usunięty.

Eksperyment 2

Wgrywamy obraz systemu – spolonizowany w trybie audytu.

System has booted, we press "Win+r", since the sysprep window has closed automatically we execute the command "sysprep", in the opened window we run "sysprep". The sysprep settings in the window: "Switch to Out-of-Box Experience (OOBE)", "Preparing for use", "Restarting". We click "OK" and wait for the system welcome. We answer the questions during the first system boot: "Continue in selected language?" – "Polski"; region – Polska; keyboard layout – Polski; add a second keyboard layout – skip; "Let’s connect you to the network" – "Skip for now"; connect to the internet – no; license agreement – accept; "Who will use this computer" – "Test"; password creation – leave the field blank; convenient work on different devices – no; privacy settings – accept. The system has booted, in the "Computer Management" snap-in we create a user named "User", add the preparation package. Result – does not work.

Eksperyment 3

Wgrywamy obraz systemu – spolonizowany w trybie audytu.

System has booted, we connect the system to the internet, execute the command "gpedit.msc" and in the "Windows Update Center" enable the option "Enable recommended updates through automatic updates", just in case we restart. In the update center, we click "Check for updates" and restart until all updates are installed. We disconnect the system from the internet. We run "sysprep" in graphical mode and repeat all actions described in the previous step from launching the "sysprep" utility up to adding the preparation package. Result – does not work.

Eksperyment 4

Uploading the system image – English version in audit mode.

We run "sysprep" in graphical mode, sealing the OS with the same parameters as during experiment 2. During the first system boot, we select the same parameters as in experiment 2, except for regional and language settings since Polish is not available. We also create a user named "User" and add the preparation package. Result – works. Thus, the problem is related to localization.

Eksperyment 5

Wgrywamy obraz systemu – spolonizowany w trybie audytu.

In the "Computer Management" snap-in we create a user "User", add the preparation package, log into the "User" account, the multimedia kiosk works.

Wylogowujemy się z konta, logujemy się na konto „Admin”. Uruchamiamy PowerShell z uprawnieniami administratora, wykonujemy polecenie „Dism /online /Get-Intl” i widzimy „Domyślny język interfejsu użytkownika: en-US”.

Uruchamiamy system z pendrive'a w WinPE, rozbudowany system mam na dysku E. Wykonujemy polecenie „Dism /image:E: /Set-UILang:ru-ru”. Sprawdzamy wynik, wykonujemy „Dism /image:E: /Get-Intl” i widzimy „Domyślny język interfejsu systemu: ru-RU”.

Logujemy się do systemu, wchodzimy na konto „User”, multikiosk nie działa.

Aby wyraźnie ustalić związek przyczynowo-skutkowy powstania problemu, spróbujemy jeszcze raz uruchomić multikiosk w wersji działającej i niedziałającej.

Uruchamiamy system z pendrive'a w WinPE, rozbudowany system mam na dysku E. Wykonujemy polecenie „Dism /image:E: /Set-UILang:en-us”. Sprawdzamy wynik, wykonujemy „Dism /image:E: /Get-Intl” i widzimy „Domyślny język interfejsu systemu: en-US”.

Logujemy się do systemu, wchodzimy na konto „User”, multikiosk działa.

Uruchamiamy system z pendrive'a w WinPE, rozbudowany system mam na dysku E. Wykonujemy polecenie „Dism /image:E: /Set-UILang:ru-ru”. Sprawdzamy wynik, wykonujemy „Dism /image:E: /Get-Intl” i widzimy „Domyślny język interfejsu systemu: ru-RU”.

Logujemy się do systemu, wchodzimy na konto „User”, multikiosk nie działa.

Tzn. można zobaczyć wyraźną zależność działania kiosku od wartości domyślnego języka interfejsu użytkownika. Czy są jeszcze jakieś inne czynniki wpływające na działanie multikiosków?

Eksperyment 6

Dla czystości eksperymentu ponownie instalujemy system. Wgrywamy obraz systemu – zrusyfikowany w trybie audytu.

Uruchamiamy „sysprep” w trybie graficznym, zapieczętujemy system z tymi samymi parametrami, co podczas eksperymentu 2. Czekamy na przywitanie systemu i odpowiadamy na pytania: „Kontynuować w wybranym języku?” – „Angielski (Stany Zjednoczone)”; region – Rosja; układ klawiatury – Rosyjski. Następnie wszystkie parametry są wybierane jak w eksperymencie 2.

Sprawdzamy parametry wartości domyślnego języka interfejsu użytkownika. Wykonujemy polecenie „Dism /online /Get-Intl” i widzimy „Domyślny język interfejsu systemu: en-US”. W narzędziu „Zarządzanie komputerem” tworzymy użytkownika „User”, dodajemy pakiet przygotowawczy, logujemy się na konto „User”, multikiosk działa.

Próbujemy zepsuć kiosk zmieniając domyślny język interfejsu użytkownika. Logujemy się na konto „Test”, które zostało utworzone przy pierwszym uruchomieniu systemu, i włączamy automatyczne logowanie, aby system nie ładował się natychmiast na konto „User”. Wykonujemy „netplwiz”, wybieramy użytkownika „Test”, odznaczamy opcję „Wymagaj wpisania nazwy użytkownika i hasła” i stosujemy ustawienia.

Rozpoczynamy z pendrive'a w WinPE. Wykonujemy polecenie „Dism /image:E: /Set-UILang:pl-pl”. Sprawdzamy wynik, wykonujemy „Dism /image:E: /Get-Intl” i widzimy „Domyślny język interfejsu użytkownika systemu: pl-PL”.

Logujemy się do systemu, próbujemy zalogować się na konto „User”, multikiosk działa. Tzn. nie można go złamać. Można go zmusić do działania w ten sposób?

Eksperyment 7

Wgrywamy obraz systemu – spolonizowany w trybie audytu.

Uruchamiamy „Sysprep.bat”, wybieramy punkt 2. Logujemy się do systemu, w narzędziu „Zarządzanie komputerem” tworzymy użytkownika „User”, dodajemy pakiet przygotowawczy, wchodzimy na konto „User”, multikiosk nie działa.

Rozpoczynamy z pendrive'a w WinPE. Wykonujemy polecenie „Dism /image:E: /Set-UILang:en-us”. Sprawdzamy wynik, wykonujemy „Dism /image:E: /Get-Intl” i widzimy „Domyślny język interfejsu użytkownika systemu: en-US”.

Logujemy się do systemu, próbujemy zalogować się na konto „User”, multikiosk nie działa.

Okazuje się, że zmiana ustawienia domyślnego języka interfejsu użytkownika wpływa na działanie multikiosku tylko podczas pracy systemu w trybie audytu lub przy pierwszym uruchomieniu po zamknięciu systemu. A to oznacza, że będziemy musieli zamknąć system z plikiem odpowiedzi, w którym wybierzemy język systemu angielski, a następnie zmienić ustawienia systemu, aby interfejs był w języku polskim. To nie jest najlepsze rozwiązanie. Może problem można rozwiązać za pomocą instalacji pakietu językowego lub dodania dodatkowych pakietów językowych?

Eksperyment 8

Uploading the system image – English version in audit mode.

Łączymy się z internetem, w ustawieniach systemu przechodzimy do sekcji „Język”, wybieramy „Dodaj język”, wybieramy język „Polski”, klikamy „Dalej”, zostawiamy domyślne opcje instalacji, klikamy „Zainstaluj”, po zainstalowaniu pakietu językowego restartujemy system, teraz jest spolonizowany. Odłączamy system od internetu, uruchamiamy „Sysprep.bat”, wybieramy punkt 2.

Po uruchomieniu systemu w narzędziu „Zarządzanie komputerem” tworzymy użytkownika „User”, dodajemy pakiet przygotowawczy, wchodzimy na konto „User”, multikiosk nie działa.

Eksperyment 9

Spróbujemy spolonizować system przed instalacją, w trybie offline. Przy okazji będzie krótki wykład na temat lokalizacji dystrybucji.

Biorę flash drive z czystym oryginalnym dystrybucją – X21-96381. Będzie to dysk „E”. Tworzę foldery do montowania obrazów: „c:MountInstall”, „c:MountWinre”, „c:MountBoot”. Biorę zestaw pakietów lokalizacyjnych – X21-87814. I do folderu „c:Mount” kopiuję z niego pakiety: „Microsoft-Windows-Client-Language-Pack_x86_pl-pl.cab”, „lp.cab”, „WinPE-Setup_pl-pl.cab”. Uruchamiam konsolę z prawami administratora. Myślę, że dalsze polecenia będą zrozumiałe bez komentarzy.

Polecenia lokalizacyjne

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_pl-pl.cabcode
dism /Image:Installcode /Set-AllIntl:pl-pl
dism /Image:Install /Set-TimeZone:"Polish 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:pl-pl
dism /Image:Winre /Set-TimeZone:"Polish Standard Time"code
dism /Unmount-Image /MountDir:Winre /Commitcode

dism /Image:Install /Gen-LangINI /distribution:E: /Set-AllIntl:pl-PLcode
dism /image:Install /Set-SetupUILang:PL-pl /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:pl-pl
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_pl-pl.cabcode
dism /Image:Bootcode /Set-AllIntl:pl-pl
copy e:sourceslang.ini Bootsourceslang.ini /ycode
dism /Unmount-Image /MountDir:Boot /Commit

Uruchamiamy komputer z flash drive, wybieramy język polski i instalujemy system na czystym dysku. Kiedy system prosi o wybór regionu, naciskamy „Ctrl+Shift+F3”. W narzędziu „Zarządzanie komputerem” tworzymy użytkownika „User”, dodajemy pakiet przygotowawczy, logujemy się na konto „User”, multikiosk nie działa.

Uruchamiamy komputer z flash drive w WinPE. Wykonujemy polecenie „Dism /image:E: /Set-UILang:en-us”.

Uruchamiamy system, próbujemy zalogować się na konto „User”, multikiosk działa.

Wygląda na to, że problem nie dotyczy metod dodawania pakietów, spróbujemy dodać dodatkowe pakiety.

Eksperyment 10

Biorę flash drive, który przygotowaliśmy na poprzednim kroku.

Biorę pakiet „Feat on Demand” – X21-87815. Do folderu „c:Mount” kopiuję z niego pakiety: „Microsoft-Windows-LanguageFeatures-Basic-pl-pl-Package~31bf3856ad364e35~x86~~.cab”, „Microsoft-Windows-LanguageFeatures-OCR-pl-pl-Package~31bf3856ad364e35~x86~~.cab”, „Microsoft-Windows-LanguageFeatures-Handwriting-pl-pl-Package~31bf3856ad364e35~x86~~.cab”, „Microsoft-Windows-LanguageFeatures-TextToSpeech-pl-pl-Package~31bf3856ad364e35~x86~~.cab”.

Bierzemy pakiet „Feat on Demand RDX Updt” – X21-99781. Do folderu „c:Mount” kopiuję z niego pakiety: „Microsoft-Windows-RetailDemo-OfflineContent-Content-Package~31bf3856ad364e35~x86~~.cab”, „Microsoft-Windows-RetailDemo-OfflineContent-Content-ru-ru-Package~31bf3856ad364e35~x86~~.cab”.

Uruchamiamy konsolę z uprawnieniami administratora i wykonujemy polecenia:

Polecenia

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

Rozpoczynamy od bootowania z pendrive'a, wybieramy język polski i instalujemy system na czystym dysku. Kiedy system prosi o wybór regionu, naciskamy „Ctrl+Shift+F3”. W narzędziu „Zarządzanie komputerem” tworzymy użytkownika „User”, dodajemy pakiet przygotowujący, logujemy się na konto „User”. Otrzymałem czarny ekran, który długo się utrzymywał, więc wykonałem twardy restart systemu.

Usuwamy pakiet przygotowujący, logujemy się jako użytkownik „User”, restartujemy system, dodajemy pakiet przygotowujący, kiosk multimedialny nie działa.

Uruchamiamy komputer z flash drive w WinPE. Wykonujemy polecenie „Dism /image:E: /Set-UILang:en-us”.

Uruchamiamy system, próbujemy zalogować się na konto „User”, multikiosk działa.

Obejście problemu

Normalni bohaterowie zawsze idą na skróty!

Różne metody instalacji pakietów lokalizacyjnych nie rozwiązały problemu, więc przy pierwszym uruchomieniu po zamknięciu systemu będziemy musieli ustawić język „en-us”, a po pierwszym uruchomieniu zmienić ustawienia językowe.

Wgrywamy obraz systemu – spolonizowany w trybie audytu.

W pliku „Unattend.xml” wpisujemy „en-US”, uruchamiamy „Sysprep.bat”, wybieramy punkt 2 i sprawdzamy, co udało nam się osiągnąć. Ekran powitalny jest w języku angielskim, kiosk multimedialny – działa. Oznacza to, że musimy dodać do „Unattend.xml” polecenie zmiany języka powitania. Aby to zrobić, należy wykonać polecenie „control intl.cpl,,/f:” z określeniem pliku konfiguracyjnego, w którym zostaną zapisane aktualne ustawienia na ekran powitalny. Zawartość pliku konfiguracyjnego będzie wyglądać następująco.

Ponieważ skopiowane zostaną ustawienia bieżącego użytkownika, polecenie należy wykonać po zalogowaniu się użytkownika, co oznacza, że będziemy potrzebować. Jest jedna mała kwestia: wykonanie nastąpi po zalogowaniu się użytkownika z uprawnieniami administratora. Nie chciałbym tworzyć dodatkowego pliku, który będzie niezbędny do pomyślnego wykonania polecenia. Lepiej zrealizować całe rozwiązanie w jednym pliku — „Unattend.xml”. W tym celu wystarczy wykonać polecenie, które tworzy plik konfiguracyjny. Myślę, że stworzę plik konfiguracyjny za pomocą polecenia „echo” w środowisku „cmd”, ale w nim trzeba zeskalować znaki mniejsze i większe za pomocą znaku caret. Tzn. żeby utworzyć plik konfiguracyjny, użyjemy poniższego polecenia.

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

Jednak to polecenie musimy umieścić w XML, który ma swoje wymagania dotyczące używania znaków specjalnych:

Znak specjalny
Wartość zastępcza

>
>

<
<

&
&


'


"

W rezultacie do utworzenia pliku konfiguracyjnego otrzymaliśmy takie polecenie dla „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;

Następnie wykonujemy polecenie z wykorzystaniem pliku konfiguracyjnego.

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

Następnie usuwamy wcześniej utworzony plik i ponownie uruchamiamy system, ponieważ zmiany wejdą w życie po ponownym uruchomieniu.

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

W rezultacie otrzymałem taki plik odpowiedzi dla sysprep’a.

Unattend.xml

reg add HKLMSoftwareMicrosoftWindowsCurrentVersionSetupOOBE /v SetupDisplayedProductKey /t REG_DWORD /d 1 /f
                    1
                    Nie pokazuj strony klucza
                
                
                    reg add HKLMSoftwareMicrosoftWindowsCurrentVersionSetupOOBE /v UnattendCreatedUser /t REG_DWORD /d 1 /f
                    2
                    Nie twórz konta
                
                
                    cmd.exe /c rd %systemdrive%Sysprep /s /q
                    3
                    Usuń folder
                
            
        
        
            
                true
                Admin
            
        
    
    
        
            en-US; pl-PL
            pl-PL
            en-US
            
            pl-PL
        
        
            
                true
                true
                true
                true
                true
                1
            
            
                
                    cmd.exe /c echo ^^^^^>"%TMP%Config.xml"
                    UtwórzConfig
                    1
                
                
                    control intl.cpl,,/f:"%TMP%Config.xml"
                    UżyjConfig
                    2
                
                
                    cmd.exe /c del "%TMP%Config.xml" /q&shutdown /r /f /t 00
                    UsuńConfig
                    3

Sprawdzamy…

Wgrywamy obraz systemu – spolonizowany w trybie audytu.

Zamieniamy plik Unattend.xml na nowy, uruchamiamy „Sysprep.bat”, wybieramy punkt 2 i patrzymy, co nam wyszło. Przy pierwszym uruchomieniu ekran powitalny jest w języku angielskim, system się uruchamia ponownie. Ekran powitalny w języku polskim, tryb wielookienkowy działa.

Jeśli masz jakieś pytania dotyczące konfiguracji i licencjonowania Windows 10 IoT Enterprise, skontaktuj się pod adresem mse@quarta.ru lub na stronie quarta-embedded.ru.
Odpowiedzi na niektóre pytania znajdziesz w naszej wikipedii lub na naszym kanale YouTube

Autor artykułu: Władimir Borisenkow, ekspert techniczny firmy Kwart Tech.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster