Windows 10 IoT Enterprise 2019 - 多信息亭模式

介绍

Windows 10 物联网企业版 2019 是Windows 10下一个版本的营销名称。该版本于2018年1809月宣布发布,分别有版本18,09是年份,10是月份。 关于Windows 1809 XNUMX新版本已经写了很多文章,但大多数都是专门讨论家里需要的各种“弓”、“美女”和各种功能。
本文将仅讨论固定用途设备制造商可能需要的功能。 即关于“Kiosk”模式的新功能。 还将涉及更改企业版 Windows 版本的服务方案名称的主题。

旧服务方案新名称

让我首先做一个简短的解释:在 Windows 版本的企业版中,有两种服务方案,Windows 根据这两种方案接收更新。 服务图有一个字母名称。 目前,服务分支机构称为 LTSC 和 SAC。

LTSC 代表 长期维修渠道 (长期维护)。 此前,这样的渠道被称为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 为他启用 kiosk 模式,然后看看这些模式如何工作。

具有多种应用程序的信息亭

有些人认为授权使用 Windows 10 物联网企业版 意味着设备上仅运行一个应用程序,实际上情况并非如此。 该设备必须设计为执行单一业务任务,并且用户不得访问桌面。 现在微软自己已经给出了使用许多应用程序的工具。 这种模式称为“多应用信息亭”;为了简洁起见,我将其称为“多信息亭”。 在本文中,我们将了解如何使用软件包设置此模式以及此模式的一些功能。

关于 Multikiosk 模式的一些信息

当您登录配置了多信息亭模式的用户帐户时,系统将以平板电脑模式工作。 “开始”菜单将展开为全屏,显示应用程序图块。

基本设置和模式功能列表:

  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没有什么不同,所以我不会描述整个安装过程,我只会谈论一些细微差别。

为了以防万一,我提醒您,不要在已安装的系统之上安装该系统。 当安装程序询问系统的安装位置时,删除未来系统磁盘上的所有分区并指定未分区的磁盘。

我们在没有互联网连接的情况下安装系统,以便系统不会拉出任何不必要的东西。

因为我们将创建系统的备份映像,为此我们将在审核模式下密封它,然后您可以在安装后立即以审核模式加载系统来节省一些时间。 为此,当系统要求您选择一个区域时,“让我们从区域开始。 是这样吗”只需按“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:”,注意命令末尾的冒号,没有它该命令将不行。 使用该命令打开一次系统参数后,即可使用图形菜单打开。

但是在系统设置中如果系统连接到互联网就可以安装语言包,没有选项可以选择从本地文件安装语言包。

我不会描述本地化系统的过程,因为...... 这将使文章变得非常复杂,特别是因为本地化过程很详细 此处描述。 但我想提请您注意使用控制台安装语言包后更改系统语言的特殊性。 此功能在我之前提供链接的同一个 wiki 中进行了描述,在小节中 “将一种语言添加到语言列表中”.

我将在没有互联网连接的情况下安装语言包。

系统完成本地化后,请务必创建系统的映像。

第 4 步 - 安装必要的应用程序

因为由于 LTSB 和 LTSC 系统没有应用程序商店,因此从 Microsoft Store 安装应用程序会带来一些困难,即下载应用程序。 对于下载应用程序,Adguard公司做了一个非常方便的服务—— “广告卫士商店”,您可以使用它获取应用程序及其组件的临时下载链接。

要安装该应用程序,您将需要扩展名为“Appx”和“AppxBundle”的文件。 在安装应用程序本身之前,您必须安装其组件。 通常,应用程序中的组件可以通过文件名直观地区分。

为了不让文章太长,我不会详细描述安装应用程序的过程,尤其是有安装信息 详细说明。 但我将添加另一种将应用程序安装到您当前帐户的方法。 可以使用该程序安装应用程序 “应用程序安装程序”,但要安装应用程序,您将需要互联网连接,但应用程序可以通过双击安装,并且您不需要其组件,所有必需的组件将下载并安装 “应用程序安装程序”.

还有一个小提醒,当将应用程序安装到当前帐户中时,您将无法密封系统。 如何安装应用程序以便可以密封系统,请参阅上面的说明。 要检查多功能信息亭的操作,现有的应用程序已经足够了。

步骤 5 – 为多信息亭创建配置文件

现在我们进入最有趣的部分 - 设置信息亭模式。 让我们看看 指令 根据我们看到的设置。 首先,我们需要创建一个 XML 配置文件,可以在此处找到完整的示例。 看这里.

让我们从设置图块布局开始。 创建 XML 磁贴自定义配置的最简单方法是 导出当前状态.

首先,让我们将所需的应用程序图块添加到“开始”菜单。 调出搜索“Win+s”,找到所需的应用程序,右键单击它并选择“固定到开始屏幕”。

我已固定以下应用程序:

  • 笔记本
  • 计算器
  • 互联网浏览器
  • 喷漆
  • 写字板
  • 参数
  • 视窗安全

最后两个应用程序被固定,因为... 标准 LTSC 封装中根本没有其他通用应用。 请注意,桌面磁贴链接到快捷方式。 现在,通过直接在“开始”菜单中移动图块,我将把固定的图块分成两组。 要创建一组新的图块,请将图块拖到比其他图块明显更高或更低的位置,这将突出显示直观的分隔线。 您可以自行决定为组命名;为此,请将鼠标光标放在组上方,当出现“命名组”字样时,单击鼠标左键。 我将第一组称为“设置”,它将包括“设置”和“Windows 安全”图块。 我将第二组称为“Office 应用程序”,其中包括所有其他图块。 顺便说一句,您可以使用组名称右上角的两个条纹拖动整个图块组来移动它们。

因为在“Windows 安全”磁贴上,名称不完全适合,我将其大小更改为“宽”。 要更改图块的大小,请右键单击图块并选择“调整大小”。

配置完成后,我们导出当前状态,在PowerShell环境中执行命令——“Export-StartLayout –路径C:SysprepStartLayout.xml”。

接下来,最简单的方法不是自己创建设置文件,而是 从这里获取示例文件 设置 – 单击“复制”按钮,将内容粘贴到记事本中并另存为“MultiAppKiosk.xml”。 现在我们将设置更改为我们自己的。 要更改附加图块的设置,请将整个“StartLayoutCollection”块从“StartLayout.xml”复制到“MultiAppKiosk.xml”。 要将应用程序添加到允许的应用程序中,您需要将通用应用程序标识符插入“AllowedApps”部分,并在同一块中添加经典应用程序可执行文件的完整路径,该路径在应用程序快捷方式的属性中指定。瓷砖参考。 要快速访问快捷方式,请右键单击固定图块,然后转到更多 > 转到文件位置。 请注意,“AppUserModelId”参数用于指定通用应用程序 ID,“DesktopAppPath”参数用于指定桌面应用程序的完整路径。 还有一个细微差别,如果您打算在 x64 系统上使用 IE,那么在允许的应用程序列表中,您必须为可执行文件“Program FilesInternet Exploreriexplore.exe”和“Program Files (x86)Internet Exploreriexplore.exe”指定两个路径。 EXE文件”。

我不会授予对文件夹的访问权限,因此我将删除“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? 下载ADK 并安装。 安装 ADK 非常简单;组件集可以保留为默认值。

启动 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点,系统被密封。 我们打开设备,系统启动,我们登录到配置了多信息亭的用户帐户,但我们无法登录。 在“欢迎”消息之后,出现“注销”消息。

起初我只想描述问题的解决方案,但后来我决定描述识别问题并找到最简单解决方案的步骤,因为...... 想必很多读者都会被模糊的疑问所困扰——“如果是这样呢……”。 我认为,如果您想找到另一种解决方案,描述各种实验将为您节省大量时间。 为了使信息尽可能准确,并再次确保没有错误,我将以“完成并记录”的格式描述实验。 那些。 我将再次进行所描述的实验。

实验

我们做了什么? 系统中有两个账户:

“管理员” – 在“管理员”组中
“用户” – 在“用户”组中
在审核模式下,多功能信息亭可以工作,但在密封状态下,它就无法工作。

实验1

我们删除已安装的准备包,在“计算机管理”管理单元中删除用户“User”并创建一个名为“User”的新用户,应用准备包,转到“User”帐户 - 它确实如此不行。 我们以“Admin”名称进入,从“Users”组中删除用户“User”,将其添加到“Administrators”组中,以“User”名称进入 - 它不起作用。 我们以“Admin”名称登录,删除带有multikiosk的准备包,以“User”名称登录 - 我们成功登录,但multikiosk模式当然不起作用,因为配置包已被删除。

实验2

我们上传系统映像 - 审核模式下的 Russified。

操作系统已加载,按“Win+r”,因为我们的sysprep窗口已经自动关闭,运行“sysprep”命令,然后在打开的窗口中运行“sysprep”。 窗口中的Sysprep设置:“进入系统欢迎窗口(OOBE)”、“准备使用”、“重新启动”。 单击“确定”并等待操作系统问候语。 我们在系统第一次启动时回答以下问题:“继续选择语言吗?” - “俄语”; 地区——俄罗斯; 键盘布局 - 俄语; 添加第二个键盘布局 - 跳过; “让我们将您连接到网络”-“暂时跳过”; 连接到互联网 - 否; 许可协议-接受; “谁将使用这台计算机”-“测试”; 创建密码 - 将字段留空; 在不同设备上方便操作——否; 隐私设置 – 接受。 操作系统已加载,在“计算机管理”管理单元中我们创建一个名为“User”的用户,添加准备包。 结果是行不通。

实验3

我们上传系统映像 - 审核模式下的 Russified。

操作系统已加载,将系统连接到互联网,运行命令“gpedit.msc”,并在“Windows Update”部分启用“通过自动更新启用推荐更新”选项,重新启动以防万一。 在更新中心,单击“检查更新”并重新启动,直至安装所有更新。 断开系统与 Internet 的连接。 我们以图形模式启动“sysprep”,并重复上一步中描述的从运行“sysprep”实用程序到添加准备包的所有步骤。 结果是行不通。

实验4

我们上传系统镜像 - 审核模式下的英文。

我们以图形模式启动“sysprep”,使用与实验2相同的参数密封操作系统。当系统首次启动时,我们选择与实验2相同的参数,但区域和语言参数除外,因为没有俄语。 以同样的方式创建用户“User”并添加预配包。 结果是它有效。 那些。 该问题与本地化有关。

实验5

我们上传系统映像 - 审核模式下的 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”。

我们启动系统,登录“用户”帐户,多功能信息亭不起作用。

那些。 您可以看到信息亭的性能明显依赖于默认用户界面语言。 也许还有其他一些因素影响多功能信息亭的性能?

实验6

为了实验的纯度,我们重新填充系统。 我们上传系统映像 - 审核模式下的 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”。

我们启动进入系统,尝试登录“用户”帐户,多功能信息亭可以工作。 那些。 它无法被打破。 有可能让它以这种方式工作吗?

实验7

我们上传系统映像 - 审核模式下的 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”。

我们启动进入系统,尝试登录“用户”帐户,多功能信息亭不起作用。

事实证明,通过更改默认用户界面语言设置,仅当系统处于审核模式或密封系统后首次启动时,您才能影响多信息亭的性能。 这意味着您必须使用响应文件来密封系统,其中系统语言将选择英语,然后更改系统设置以使界面为俄语。 这不是一个很好的解决方案。 也许可以通过安装语言包或安装额外的语言包来解决问题?

实验8

我们上传系统镜像 - 审核模式下的英文。

我们连接上互联网,在系统参数中进入“语言”部分,选择“添加语言”,选择语言“俄语”,点击“下一步”,安装参数保持默认,点击“安装”,安装完成语言包我们重新启动系统,现在是俄罗斯化的。 断开系统与互联网的连接,运行“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”。

我们启动进入系统,尝试登录“用户”帐户,多功能信息亭可以工作。

显然问题不在于添加包的方法,让我们尝试添加其他包。

实验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”帐户。 我的黑屏挂了很长时间,所以我热启动了系统。

我们删除准备包,以“用户”身份登录,重新启动系统,添加准备包,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中,它对特殊字符的使用有自己的要求:

特殊字符
重置价值

>
&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 应答文件。

无人值守.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>

让我们检查...

我们上传系统映像 - 审核模式下的 Russified。

我们将 Unattend.xml 文件更改为新文件,运行“Sysprep.bat”,选择第 2 点,看看我们得到了什么。 首次启动时,欢迎屏幕为英文,并且系统将重新启动。 欢迎屏幕是俄语的,多功能信息亭可以使用。

如果您对 Windows 10 IoT Enterprise 的设置和许可有任何疑问,请联系: [电子邮件保护] 或访问网站 quarta-embedded.ru.
您可以在以下位置找到一些问题的答案 我们的维基 或在我们的 YouTube频道

文章作者:Vladimir Borisenkov,Quarta Technologies 技术专家。

来源: habr.com