介紹
本文將只討論固定用途設備製造商可能需要的功能。 即關於「Kiosk」模式的新功能。 也將涉及更改企業版 Windows 版本的服務方案名稱的主題。
舊服務方案新名稱
讓我先做一個簡短的解釋:在 Windows 版本的企業版中,有兩種服務方案,Windows 根據這兩個方案接收更新。 服務圖有一個字母名稱。 目前,服務分支機構稱為 LTSC 和 SAC。
LTSC 代表
微軟也更改了服務分支CBB——Current Branch for Business的名稱,現在這個服務分支稱為SAC——
但應該要提到的是,LTSC 和 SAC 服務分公司使用不同的 Windows 發行版。
關於 SAC 新資訊亭模式的一些信息
正如我已經說過的,LTSC 和 SAC 有不同的分佈。 LTSC 沒有標準的通用應用程式或應用程式商店,但 SAC 有。 因此,LTSC 沒有 Edge 瀏覽器,但 SAC 有。 如果您在設定資訊亭時選擇 Edge 瀏覽器,現在有兩種模式可用:
- 作為數位看板或互動式顯示器
- 就像公共瀏覽器一樣
我不會詳細討論設定這些模式,因為... 設定非常簡單,並在圖形介面中完成。 只需建立一個不是管理員群組成員的用戶,使用 EDGE 為他啟用 kiosk 模式,然後看看這些模式如何運作。
具有多種應用程式的資訊亭
有些人認為授權使用
關於 Multikiosk 模式的一些信息
當您登入配置了多資訊亭模式的使用者帳戶時,系統將以平板電腦模式運作。 「開始」功能表將展開為全屏,顯示應用程式圖塊。
基本設定和模式功能清單:
- 為多個使用者或群組進行設置
- 每個使用者或群組都可以分配單獨的設置
- 能夠使用通用和經典應用程式
- 當使用者登入時自動啟動應用程式之一的能力
- 白名單應用程式
- 使用白名單存取資料夾
值得注意的是第 5 點,預設情況下,只有系統運行所必需的應用程式才會被允許運行;其他應用程式必須添加到允許的應用程式清單中。 那些。 現在您不需要單獨配置AppLocker。 順便說一下,為了避免與 AppLocker 設定發生衝突,在多資訊亭模式下,所有配置的 AppLocker 規則將不適用。
第 6 點表明是一個不錯的選擇,但目前只能授予「Downloads」資料夾寫入權限。 此模式允許您使用通用和經典應用程式。 所有模式設定均在 XML 檔案中指定,您也可以在其中指定單一應用程式資訊亭的設定。
現在讓我們嘗試將其全部設定...
我們需要什麼...
- 首先,我們需要係統本身,它支援多資訊亭模式。
在這裡您可以下載 示範版 設定多功能資訊亭的說明 - 任何 XML 編輯器
- 要套用多資訊亭設定:
他說——“我們走吧!”
我將在 Windows 10 IoT Enterprise 1809 LTSC x32 商業版本而不是演示版本上進行所有實驗。 系統不會被激活,因為缺少啟動不會影響系統的功能。 我選擇 32 位元只是因為它佔用的空間更少,而且處理系統映像的速度會更快。
第 1 步 – 安裝
安裝Win 10 IoT Enterprise與安裝Win 10 Enterprise沒有什麼不同,所以我不會描述整個安裝過程,我只會談論一些細微差別。
為了以防萬一,我提醒您,不要在已安裝的系統上方再安裝系統。 當安裝程式詢問系統的安裝位置時,請刪除未來系統磁碟上的所有分割區並指定未分割的磁碟。
我們在沒有網路連線的情況下安裝系統,以便系統不會拉出任何不必要的東西。
因為我們將建立系統的備份映像,為此我們將在審核模式下密封它,然後您可以在安裝後立即以審核模式載入系統節省一些時間。 為此,當系統要求您選擇一個區域時,「讓我們從區域開始。 是這樣嗎」只要按「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
啟動後,該腳本將檢查「管理員」帳戶是否存在,如果缺少則建立一個。 該帳戶將被新增至管理員群組。
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視窗。 當在 hello 模式下密封時,腳本將從註冊表中刪除關閉視窗的命令,並且本身會將應答檔案中的體系結構值變更為目前值。 應答檔案包含用於在無需使用者互動的情況下啟動系統的參數以及用於刪除系統磁碟機根目錄中的「Sysprep」資料夾的命令。
現在我將使用“Sysprep.bat”以審核模式密封系統並擷取系統的映像。 我將使用 DISM 對系統進行映像,並且僅對系統磁碟區進行映像。 如果您僅對系統磁碟區進行映像,而不是整個磁碟,請勿忘記在部署系統後將「WindowsSystem32Recovery」目錄的內容複製到第一個磁碟區的「RecoveryWindowsRE」資料夾中。 這需要在載入作業系統之前完成。 載入作業系統後,「WindowsSystem32Recovery」目錄已為空。
步驟 3 – 系統的俄羅斯化
如果您有該語言包,則可以在沒有 Internet 連線的情況下安裝該語言包。 如果沒有,當您在設定中新增語言時,系統本身會從網路上下載它。 只是不需要從以前版本的作業系統中取得語言包。 對於 Windows 10 1809,必須有專門用於 Windows 10 1809 的語言套件。
微軟正在按照其計劃逐步將設定從經典選單轉移到新選單,因此在經典控制面板中您將不再找到用於更改語言和安裝語言套件的設定。 這些設定現在僅存在於系統參數中。
在審核模式下,從開始功能表開啟系統設定可能會遇到問題;要開啟系統設置,請執行指令 - “ms-settings:”,注意指令末尾的冒號,沒有它該指令將不行。 使用此指令開啟一次系統參數後,即可使用圖形選單開啟。
但是在系統設定中如果系統連接到互聯網就可以安裝語言包,沒有選項可以選擇從本地文件安裝語言包。
我不會描述本地化系統的過程,因為... 這將使文章變得非常複雜,特別是因為本地化過程很詳細
我將在沒有網路連線的情況下安裝語言套件。
系統完成本地化後,請務必建立系統的映像。
步驟 4 - 安裝必要的應用程式
因為由於 LTSB 和 LTSC 系統沒有應用程式商店,因此從 Microsoft Store 安裝應用程式會帶來一些困難,即下載應用程式。 對於下載應用程序,Adguard公司做了一個非常方便的服務—
要安裝該應用程序,您將需要擴展名為“Appx”和“AppxBundle”的檔案。 在安裝應用程式本身之前,您必須安裝其元件。 通常,應用程式中的元件可以透過檔案名稱直觀地區分。
為了不讓文章太長,我不會詳細描述安裝應用程式的過程,尤其是有安裝信息
還有一個小提醒,當將應用程式安裝到目前帳戶時,您將無法密封系統。 如何安裝應用程式以便可以密封系統,請參閱上面的說明。 要檢查多功能資訊亭的操作,現有的應用程式已經足夠了。
步驟 5 – 為多資訊亭建立設定檔
現在我們進入最有趣的部分 - 設定資訊亭模式。 讓我們看看
讓我們從設定圖塊佈局開始。 建立 XML 磁貼自訂配置最簡單的方法是
首先,讓我們將所需的應用程式圖塊新增至「開始」功能表。 調出搜尋“Win+s”,找到所需的應用程序,右鍵單擊它並選擇“固定到開始畫面”。
我已固定以下應用程式:
- 筆記本
- 計算器
- 互聯網瀏覽器
- 畫
- 寫字板
- 參數
- БезопасностьWindows
最後兩個應用程式被固定,因為... 標準 LTSC 封裝中根本沒有其他通用應用。 請注意,桌面磁貼連結到快捷方式。 現在,透過直接在「開始」功能表中移動圖塊,我將把固定的圖塊分成兩組。 要建立一組新的圖塊,請將圖塊拖曳到比其他圖塊明顯更高或更低的位置,這將突出顯示直觀的分隔線。 您可以自行決定為群組命名;為此,請將滑鼠遊標放在群組上方,當出現「命名群組」字樣時,按一下滑鼠左鍵。 我將第一組稱為“設定”,它將包括“設定”和“Windows 安全性”圖塊。 我將第二組稱為“Office 應用程式”,其中包括所有其他圖塊。 順便說一句,您可以使用群組名稱右上角的兩個條紋拖曳整個圖塊組來移動它們。
因為在“Windows 安全性”磁貼上,名稱不完全適合,我將其大小更改為“寬”。 若要變更圖塊的大小,請右鍵點選圖塊並選擇「調整大小」。
配置完成後,我們匯出目前狀態,在PowerShell環境中執行命令-「Export-StartLayout –路徑C:SysprepStartLayout.xml」。
接下來,最簡單的方法不是自己建立設定文件,而是
我不會授予對資料夾的存取權限,因此我將刪除“FileExplorerNamespaceRestrictions”部分。
顯示工作列並不困擾我,所以我將「工作列」部分中的所有內容保留原樣。
在範例中,指定了兩個配置文件,但我只有一個配置文件,因此可以刪除具有第二個配置文件的部分。 在卸載之前,請注意自動啟動帶有參數的應用程式的範例。
在「配置」部分,帳戶連結到設定檔;請注意,多個帳戶可以連結到一個設定檔。 但是因為我只對一個帳戶感興趣,然後我將刪除除第一個帳戶(「配置」區塊)之外的所有綁定。 在剩餘的綁定中,我將寫入使用者名稱“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?
啟動 ICD,按一下「進階準備」圖塊,指定專案的名稱和資料夾,然後按一下「下一步」。 在下一個視窗中,選擇“Windows 桌面的所有版本”,然後按一下“下一步”。 您可以跳過導入準備包;按一下「完成」。
展開「執行時間設定」下拉式選單,然後展開「AssignedAccess」子選單並選擇「MultiAppAssignedAccessSettings」。 在 ICD 視窗中間部分的頂部,按一下「瀏覽」按鈕並使用設定指示 XML 檔案的位置。 為了以防萬一,您可以按“Ctrl+s”儲存項目。 在 ICD 的左上方,選擇“匯出”,然後從下拉式選單中選擇“配置套件”。 作為所有者,選擇“IT 管理員”;所有其他問題可以透過點擊“下一步”跳過,最後按一下“建置”和“完成”。
在安裝的系統中,不要忘記建立一個使用者「User」;他不能被加入到「Administrators」群組,否則multikiosk將無法運作。 我在電腦管理中創建了一個用戶,其密碼永不過期。
現在我們在之前安裝的系統上運行準備包。 套用準備包後,開始功能表和管理員選單將會發生變化。 在左側開始列中,按鈕應該會消失:「文件」、「圖像」、「選項」。 如果開始功能表沒有改變,則表示出現了問題。 可以透過開啟「設定」>「帳戶」>「工作或學校帳戶存取」>「新增或刪除預配包」視窗來刪除已安裝的套件。
如果開始功能表已更改,則設定將套用至系統,以設定多功能資訊亭的使用者身分登入並查看結果。
方法#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>
關於腳本的一些功能。 此腳本設計為使用「UTF8」編碼的 XML 檔案;如果要使用「ANSI」編碼,請從檔案讀取選項中刪除「encoding UTF8」參數。 您必須將 XML 檔案放置在「XML」資料夾中,且不取代字元;腳本本身將以適當的名稱取代特殊字元。 為了避免混淆將使用者連結到設定檔的 GUID,您可以簡單地在大括號中指示使用者編號或名稱;大括號中的所有內容都將替換為 GUID。
使用該腳本非常簡單,只需運行它並選擇所需的項目。 若要將目前配置變更為新配置,無需刪除目前配置;它將被覆寫。 不要忘記創建設定檔中指定的使用者。
在套用此配置的相同會話中查看目前多資訊亭配置時,將顯示替換字元的組合,而不是特殊字元。 更改會話(重新啟動腳本)後,所有特殊字元都將以其原始形式顯示。
第 7 步 - 密封系統
多功能資訊亭可以工作,好吧,僅此而已,看起來...
如果一切都按計劃進行,那麼你就不會注意到某些事情。
不要忘記我們仍然需要將系統從審核模式切換到歡迎模式。 好了,我們已經準備好了,我們啟動“Sysprep.bat”,選擇第2點,系統被密封。 我們開啟設備,系統啟動,我們登入配置了多資訊亭的使用者帳戶,但我們無法登入。 在「歡迎」訊息之後,出現「註銷」訊息。
起初我只想描述問題的解決方案,但後來我決定描述識別問題並找到最簡單解決方案的步驟,因為... 想必很多讀者都會被模糊的疑問所困擾——「如果是這樣呢……」。 我認為,如果您想找到另一種解決方案,描述各種實驗將為您節省大量時間。 為了使資訊盡可能準確,並再次確保沒有錯誤,我將以「完成並記錄」的格式描述實驗。 那些。 我將再次進行所描述的實驗。
實驗
我們做了什麼? 系統中有兩個帳戶:
「管理員」 – 在「管理員」群組中
「使用者」 – 在「使用者」群組中
在審核模式下,多功能資訊亭可以工作,但在密封狀態下,它就無法運作。
實驗一
我們刪除已安裝的準備包,在“電腦管理”管理單元中刪除用戶“User”並創建一個名為“User”的新用戶,應用準備包,轉到“User”帳戶 - 它確實如此不行。 我們以“Admin”名稱進入,從“Users”群組中刪除使用者“User”,將其新增至“Administrators”群組中,以“User”名稱進入 - 它無法運作。 我們以“Admin”名稱登錄,刪除帶有multikiosk的準備包,以“User”名稱登錄 - 我們成功登錄,但multikiosk模式當然不起作用,因為配置包已被刪除。
實驗一
我們上傳系統映像 - 審核模式下的 Russified。
作業系統已加載,按“Win+r”,因為我們的sysprep視窗已經自動關閉,執行「sysprep」指令,然後在開啟的視窗中執行「sysprep」。 視窗中的Sysprep設定:「進入系統歡迎視窗(OOBE)」、「準備使用」、「重新啟動」。 點擊“確定”並等待作業系統問候語。 我們在系統第一次啟動時回答以下問題:“繼續選擇語言嗎?” - 「俄語」; 地區——俄羅斯; 鍵盤佈局 - 俄語; 新增第二個鍵盤佈局 - 跳過; 「讓我們將您連接到網路」-「暫時跳過」; 連接到網際網路 - 否; 許可協議-接受; “誰將使用這台計算機”-“測試”; 建立密碼 - 將欄位留空; 在不同設備上方便操作-否; 隱私設定 – 接受。 作業系統已加載,在「電腦管理」管理單元中我們建立一個名為「User」的用戶,新增準備包。 結果是行不通。
實驗一
我們上傳系統映像 - 審核模式下的 Russified。
作業系統已加載,將系統連接到互聯網,運行命令“gpedit.msc”,並在“Windows Update”部分啟用“透過自動更新啟用建議更新”選項,重新啟動以防萬一。 在更新中心,按一下「檢查更新」並重新啟動,直到安裝所有更新。 斷開系統與 Internet 的連線。 我們以圖形模式啟動“sysprep”,並重複上一個步驟中描述的從執行“sysprep”實用程式到新增準備包的所有步驟。 結果是行不通。
實驗一
我們上傳系統鏡像 - 審核模式下的英文。
我們以圖形模式啟動“sysprep”,使用與實驗2相同的參數密封作業系統。當系統首次啟動時,我們選擇與實驗2相同的參數,但區域和語言參數除外,因為沒有俄語。 以同樣的方式建立使用者「User」並新增預配包。 結果是它有效。 那些。 該問題與本地化有關。
實驗一
我們上傳系統映像 - 審核模式下的 Russified。
在“電腦管理”管理單元中,建立一個使用者“User”,新增一個準備包,進入“User”帳戶,多資訊亭就可以工作了。
登出您的帳戶並使用「管理員」帳號登入。 我們以管理員權限啟動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”。
我們啟動系統,登入「使用者」帳戶,多功能資訊亭不起作用。
為了清楚地建立問題的因果關係,讓我們再次嘗試使多資訊亭工作和不工作。
我們從隨身碟啟動到WinPE,部署的作業系統在我的E碟上。我們執行指令「Dism /image:E: /Set-UILang:en-us」。 我們查看結果,執行“Dism /image:E: /Get-Intl”,看到“Default system UI language: en-US”。
我們啟動系統,登入「使用者」帳戶,多功能資訊亭就可以工作了。
我們從隨身碟啟動到WinPE,部署的作業系統在我的E碟上。我們執行指令「Dism /image:E: /Set-UILang:ru-ru」。 我們查看結果,執行“Dism /image:E: /Get-Intl”,看到“Default system UI language: ru-RU”。
我們啟動系統,登入「使用者」帳戶,多功能資訊亭不起作用。
那些。 您可以看到資訊亭的效能明顯依賴預設使用者介面語言。 也許還有其他一些因素影響多功能資訊亭的性能?
實驗一
為了實驗的純度,我們重新填充系統。 我們上傳系統映像 - 審核模式下的 Russified。
我們以圖形模式啟動“sysprep”,使用與實驗 2 相同的參數密封作業系統。我們等待作業系統向我們打招呼並回答問題:“繼續選擇語言嗎?” - “美國英語)”; 地區——俄羅斯; 鍵盤佈局 - 俄語。 此外,所有參數的選擇與實驗2相同。
讓我們看看預設的使用者介面語言設定。 我們執行指令“Dism /online /Get-Intl”,看到“預設系統UI語言:en-US”。 在“電腦管理”管理單元中,建立一個使用者“User”,新增一個準備包,進入“User”帳戶,多資訊亭就可以工作了。
我們正在嘗試透過更改預設使用者介面語言來破壞資訊亭。 我們進入系統首次啟動時創建的“Test”用戶,並為其啟用自動登錄,以便系統不會立即啟動到“User”帳戶。 執行“netplwiz”,選擇“測試”用戶,取消選取“需要用戶名稱和密碼”複選框並套用參數。
從快閃磁碟機啟動到 WinPE。 執行指令「Dism /image:E:/Set-UILang:ru-ru」。 我們查看結果,執行“Dism /image:E: /Get-Intl”,看到“Default system UI language: ru-RU”。
我們啟動進入系統,嘗試登入「使用者」帳戶,多功能資訊亭可以工作。 那些。 它無法被打破。 有可能讓它以這種方式運作嗎?
實驗一
我們上傳系統映像 - 審核模式下的 Russified。
我們啟動“Sysprep.bat”,選擇點2。我們啟動進入系統,在“電腦管理”管理單元中建立使用者“User”,新增準備包,到“User”帳戶,多資訊亭不工作。
從快閃磁碟機啟動到 WinPE。 執行指令「Dism /image:E:/Set-UILang:en-us」。 我們查看結果,執行“Dism /image:E: /Get-Intl”,看到“Default system UI language: en-US”。
我們啟動進入系統,嘗試登入「使用者」帳戶,多功能資訊亭不起作用。
事實證明,透過更改預設使用者介面語言設置,僅當系統處於審核模式或密封系統後首次啟動時,您才能影響多資訊亭的效能。 這意味著您必須使用響應文件來密封系統,其中系統語言將選擇英語,然後更改系統設定以使介面為俄語。 這不是一個很好的解決方案。 也許可以透過安裝語言包或安裝額外的語言包來解決問題?
實驗一
我們上傳系統鏡像 - 審核模式下的英文。
我們連接上互聯網,在系統參數中進入“語言”部分,選擇“添加語言”,選擇語言“俄語”,點擊“下一步”,安裝參數保持默認,點擊“安裝”,安裝完成語言包我們重新啟動系統,現在是俄羅斯化的。 斷開系統與網際網路的連接,執行“Sysprep.bat”,選擇第2點。
載入系統後,在「電腦管理」管理單元中,建立「User」用戶,新增準備包,進入「User」帳戶,多資訊亭不起作用。
實驗一
讓我們在安裝之前嘗試以離線模式俄羅斯化系統。 同時,也將有一個關於發行版本地化的簡短教育計畫。
我使用一個帶有乾淨原始發行版的閃存驅動器 - 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」。
我們啟動進入系統,嘗試登入「使用者」帳戶,多功能資訊亭可以工作。
顯然問題不在於添加包的方法,讓我們嘗試添加其他包。
實驗一
我們使用上一步中準備的閃存驅動器。
我們採用「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」帳戶。 我的黑屏掛了很長時間,所以我熱啟動了系統。
我們刪除準備包,以「使用者」身分登錄,重新啟動系統,新增準備包,multikiosk 不起作用。
從快閃磁碟機啟動到 WinPE。 執行指令「Dism /image:E:/Set-UILang:en-us」。
我們啟動進入系統,嘗試登入「使用者」帳戶,多功能資訊亭可以工作。
解決方法
普通英雄。 他們總是繞路!
安裝在地化套件的各種方法都沒有解決問題,這意味著你必須在密封後首次啟動時安裝「en-us」語言,並在首次啟動後更改語言設定。
我們上傳系統映像 - 審核模式下的 Russified。
在“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”中實施整個解決方案。 為此,您只需運行建立設定檔的命令即可。 我想我將在“cmd”環境中使用“echo”命令創建一個配置文件,但它需要用抑揚符來轉義尖括號。 那些。 要建立配置文件,需要取得以下命令。
echo ^<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend"^>^<gs:UserList^>^<gs:User UserID="Current" CopySettingsToSystemAcct="true"/^>^</gs:UserList^>^</gs:GlobalizationServices^>>Config.xml
但是我們需要把這個指令放在XML中,它對特殊字元的使用有自己的要求:
特殊字元
重置價值
>
>
<
<
&
&
“
'
“
"
因此,為了建立設定文件,我們得到了以下「FirstLogonCommands」命令。
cmd.exe /c echo ^<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend"^>^<gs:UserList^>^<gs:User UserID="Current" CopySettingsToSystemAcct="true"/^>^</gs:UserList^>^</gs:GlobalizationServices^>>"%TMP%Config.xml"
接下來,我們使用設定檔執行命令。
control intl.cpl,,/f:"%TMP%Config.xml"
接下來,刪除先前建立的檔案並重新啟動系統。 更改將在重新啟動後生效。
cmd.exe /c del "%TMP%Config.xml" /q&shutdown /r /f /t 00
結果,我最終得到了以下 sysprep 應答文件。
無人值守.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 ^<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend"^>^<gs:UserList^>^<gs:User UserID="Current" CopySettingsToSystemAcct="true"/^>^</gs:UserList^>^</gs:GlobalizationServices^>>"%TMP%Config.xml"</CommandLine>
<Description>CreateConfig</Description>
<Order>1</Order>
</SynchronousCommand>
<SynchronousCommand wcm:action="add">
<CommandLine>control intl.cpl,,/f:"%TMP%Config.xml"</CommandLine>
<Description>UseConfig</Description>
<Order>2</Order>
</SynchronousCommand>
<SynchronousCommand wcm:action="add">
<CommandLine>cmd.exe /c del "%TMP%Config.xml" /q&shutdown /r /f /t 00</CommandLine>
<Description>DelConfig</Description>
<Order>3</Order>
</SynchronousCommand>
</FirstLogonCommands>
</component>
</settings>
讓我們檢查...
我們上傳系統映像 - 審核模式下的 Russified。
我們將 Unattend.xml 文件更改為新文件,運行“Sysprep.bat”,選擇第 2 點,看看我們得到了什麼。 首次啟動時,歡迎畫面為英文,系統將重新啟動。 歡迎螢幕是俄語的,多功能資訊亭可以使用。
如果您對 Windows 10 IoT Enterprise 的設定和授權有任何疑問,請聯絡:
您可以在以下位置找到一些問題的答案
文章作者:Vladimir Borisenkov,Quarta Technologies 技術專家。
來源: www.habr.com