用信息亭模式固化业务终端 ── Assigned Access・Shell Launcher 的选择方法与运维设计

· · 信息亭模式, Assigned Access, Shell Launcher, Windows 11, 业务终端, 设备联动, 信息系统部门, 运维设计

「明明应该是前台终端,客人却从任务栏打开了 Excel」「设备操作画面背后一直在播放 YouTube,触摸屏反应迟钝的投诉原因就出在这里」「展会的演示机,早上过去一看桌面完全暴露,还停在屏幕保护程序的设置界面」── 原本应该专用于特定应用的 Windows 终端,只要放任不管,就一定会被当成「普通的电脑」来用。

常见的对策是「设置自动登录,并把业务应用注册到启动项」,但这其实什么都没守住。Explorer 外壳整体依然活着,无论 Alt+Tab 还是 Win 键,都能一瞬间跳到桌面。话虽如此,Windows 为信息亭用途准备了 Assigned Access・Shell Launcher・多应用信息亭模式等多种机制,而具体能用哪一种,会因版本(Edition)和 Windows 版本号的不同而变化,因此「本来打算在 Pro 终端上搭建,却发现没有 Shell Launcher」这类返工也时常发生。

本文面向想要为前台终端、工厂操作终端、检测设备操作画面、展会终端等构建「只运行一个应用的电脑」的开发者与信息系统部门人员,基于官方文档的依据,梳理各方式的全貌与版本要求、PowerShell/XML 的配置示例,直至自动登录、从异常退出中恢复、Windows Update、维护途径等运维设计。

1. 先说结论

  • 「自动登录 + 启动项启动」不是信息亭模式。只要 Explorer 外壳还活着,用户就什么都能做。想要真正防护,就要使用专用机制。
  • Assigned Access 的单应用信息亭模式会在锁屏界面之上全屏运行 UWP 应用或 Microsoft Edge,应用被关闭后会自动重新启动。Pro 及以上版本均可使用。1
  • 在 Windows 11 上,Assigned Access 也可以把 Win32(桌面)应用做成信息亭模式。在 Windows 11(21H2)及以后新增的架构中,可以在 v4:ClassicAppPath 中指定 EXE 的路径。Windows 10 的信息亭模式仅限于 UWP/Edge。2
  • Shell Launcher 是把 Explorer.exe 本身替换为业务应用(Win32/UWP)的机制,仅限 Enterprise / Education / IoT Enterprise 系列版本。Pro 无法使用。可以声明式地配置外壳退出时的动作(重启外壳、重启终端等)。34
  • 多应用信息亭模式(受限用户体验)是通过允许应用列表与专用开始菜单,构建「只能使用几个指定应用的共享终端」的方式。AppLocker 规则会自动生成,未获许可的应用无法启动。2
  • 配置方式正在走向统一。无论是单应用、多应用还是 Shell Launcher,如今的标准做法都是通过 AssignedAccess CSP(Intune 等 MDM),或者在本地通过 WMI 网桥 + PowerShell 调用同一个 CSP 来完成配置。56
  • 信息亭体验的默认退出方式是 Ctrl+Alt+Del。在 Windows 11 上可以用 BreakoutSequence 更改。请务必在设计中保留维护人员登录的途径。2
  • 即使固化了终端,如果业务应用一侧的设计(全屏 UI、不显示退出按钮、异常时自我恢复)没有做到位,仍然会留下漏洞。操作系统的机制与应用的设计是一体的。

2. 全局概览 ── 四种方式的区别在于「能守住什么」

首先把各种方式并排列出来。重要的不是外观,而是Explorer 外壳处于什么状态,以及由谁来阻止未获许可的操作

方式 可运行的应用 外壳状态 能守住的范围 版本
自动登录 + 启动项启动 任意 Explorer 保持原样 几乎守不住任何东西(Alt+Tab、Win 键、任务管理器全部畅通无阻) 全部版本
Assigned Access 单应用信息亭模式 UWP / Edge(Windows 11 也可用于 Win322 在锁屏界面之上仅全屏运行目标应用,关闭后自动重启1 无法触及桌面・开始菜单。默认退出方式仅有 Ctrl+Alt+Del Pro 及以上1
多应用信息亭模式(受限用户体验) 允许列表中的应用(可混合 UWP/Win32) 专用开始菜单 + AppLocker 阻止未获许可的启动2 阻止未获许可应用的启动。但 Alt+F4 与 Ctrl+Alt+Del 默认仍然有效7 Pro 及以上1
Shell Launcher 把任意 Win32 / UWP 应用作为外壳 Explorer.exe 本身不存在(由 CustomShellHost.exe 启动并监视业务应用)3 没有任务栏也没有开始菜单。但并不阻止其他应用本身的启动,如有需要应并用 AppLocker 等3 仅限 Enterprise / Education / IoT Enterprise 系列3

各方式的适用场景大致如下。

  • 供访客或不特定人员使用的终端(前台、展会、公共浏览)适合单应用信息亭模式,可接触的面最小。
  • 使用固定几个应用的共享终端(现场产线终端、教育用途)适合多应用信息亭模式。
  • 把单个 Win32 业务应用作为设备操作画面运行的工业用途适合 Shell Launcher。其优势在于 Explorer 相关的 UI(通知、任务栏、边缘滑动弹出的 UI)根本不存在,还可以按退出代码配置恢复动作,这对设备场景很合适。4
  • 自动登录 + 启动项虽然可以作为上述方式的组成部分(登录自动化)使用,但其本身并不是信息亭模式。

另外,同一台终端不能同时配置 KioskModeApp(单应用信息亭模式)与 Shell Launcher2 两者只能二选一。

3. 版本要求 ── Pro 能做到什么,Enterprise 需要什么

在选定方式之前,请先确认手头终端的版本。如果把这一步往后拖,会导致整个设计推倒重来。

  • Assigned Access(单应用/多应用):Pro / Enterprise / Education / IoT Enterprise(含各自的 LTSC)。1
  • Shell Launcher:Enterprise / Enterprise LTSC / Education / IoT Enterprise / IoT Enterprise LTSC。Pro 不可用3
  • Keyboard Filter(按键屏蔽):仅限 Enterprise / Education / IoT Enterprise 系列。Pro 不可用8

也就是说,「想在 Pro 终端上只运行一个 Win32 应用」这一常见需求,

  • 在 Windows 11 上,可以直接通过 Assigned Access 的 v4:ClassicAppPath 实现。2
  • 在 Windows 10 Pro 上则没有直接的选项,只能选择 UWP 化,或者用多应用信息亭模式 + 自动启动(rs5:AutoLaunch)来接近这个效果,或者升级版本。2

如果是在设备内嵌或工业 PC 场景中可以新选定终端,那么 Shell Launcher、Keyboard Filter 一应俱全、又不会被强制推送功能更新的 IoT Enterprise LTSC 才是首选。版本选定的思路,在同日发布的「产业用PC的Windows选择 ── IoT Enterprise LTSC实践指南」中有详细介绍。

还有一个前提是:信息亭体验要求已启用 UAC,并且必须从控制台登录。通过远程桌面连接无法运行信息亭体验。1「想用 RDP 连进去确认一下动作」结果发现完全不工作而困惑,是常见的初次踩坑场景。控制台会话与 RDP 会话的关系,请参见「如何理解 Windows 的会话隔离 ── Session 0・RDP・多用户同时运行」。

4. 用 Assigned Access 构建单应用信息亭模式

配置途径有三种。按照由简到繁的顺序,在 4.1~4.3 中依次介绍;其中最核心的配置 XML,还会继续讲解实际应用到终端的步骤(4.4)以及验证是否生效的方法(4.5)。

4.1 用「设置」应用构建(仅限单台・Edge/UWP 场景下最快捷)

可以通过向导完成信息亭专用本地账户的创建与目标应用的选择。步骤如下。5

  1. 打开「设置」> 「账户」> 「其他用户」
  2. 点击「设置信息亭模式」(Set up a kiosk)中的「开始」(Get Started)
  3. 「创建账户」对话框中输入账户名,点击「下一步」(如果已有本地标准用户,也可以选择「选择现有账户」)
  4. 选择在信息亭账户登录时要运行的应用。如果选择了 Microsoft Edge,接下来还需设置以下内容
    • 使用全屏显示(数字标牌)模式,还是保留部分浏览器操作(公共浏览器)模式
    • 登录时打开的 URL
    • 如果选择了公共浏览器模式,设置在持续无操作多长时间后重启 Edge
  5. 点击「关闭」

完成设置后重启终端,创建好的本地账户会自动登录,并启动指定的应用。5 如果只是单台终端,且是 Edge 或简单的 UWP 应用,这样就足够了。

4.2 用 PowerShell cmdlet 构建(仅限 UWP)

Set-AssignedAccess 可以用一行命令创建「这个本地标准用户只能用这个 UWP 应用」这样的最小配置(仅限 UWP・仅限本地标准用户・不能是管理员账户)。9

# 让本地标准用户 KioskUser 专用于该 UWP 应用
Set-AssignedAccess -UserName 'KioskUser' -AppUserModelId 'Contoso.KenkiPanel_abc123!App'

# 解除配置
Clear-AssignedAccess

传入参数的AUMID(AppUserModelID)可以用 Get-StartApps 查询。这个 cmdlet 会列出已安装应用的名称和 AppID,返回NameAppID 两列10

# 从列表中肉眼查找
Get-StartApps

# 用名称的一部分筛选(可用通配符)。AppID 列的值就是 AUMID 本身
Get-StartApps -Name '*KenkiPanel*' | Format-Table Name, AppID -AutoSize

输出格式如下(具体值因环境而异)。10

Name              AppID
----              -----
KenkiPanel        Contoso.KenkiPanel_abc123!App

需要特别注意的是,Get-StartApps 返回的是「当前运行用户」已安装的应用。如果想查询为信息亭账户预置的应用,请用该账户登录后再执行。用管理员账户执行却查不到,是常见的踩坑之处。同时还要注意,UWP 应用更新后 AUMID 有可能发生变化(此时需要重新制作配置)。7

4.3 配置 XML + AssignedAccess CSP(核心方法)

这是涵盖指定 Win32 应用、自动登录、更改退出键在内的核心方法。在 Intune 等 MDM 中通过 ./Vendor/MSFT/AssignedAccess/Configuration 下发;在独立终端上,则通过 WMI 网桥,从 SYSTEM 权限的 PowerShell 中写入同一份 XML。5 XML 的要点如下。

<AssignedAccessConfiguration
    xmlns="http://schemas.microsoft.com/AssignedAccess/2017/config"
    xmlns:rs5="http://schemas.microsoft.com/AssignedAccess/201810/config"
    xmlns:v4="http://schemas.microsoft.com/AssignedAccess/2021/config">
  <Profiles>
    <Profile Id="{EDB3036B-780D-487D-A375-69369D8A8F78}">
      <!-- Windows 11:把 Win32 应用做成信息亭模式(也可以传入参数) -->
      <KioskModeApp v4:ClassicAppPath="%ProgramFiles%\Contoso\KenkiPanel.exe"
                    v4:ClassicAppArguments="--line 3" />
      <!-- 把退出键从默认的 Ctrl+Alt+Del 改为其他组合 -->
      <v4:BreakoutSequence Key="Ctrl+Alt+K" />
    </Profile>
  </Profiles>
  <Configs>
    <Config>
      <!-- 由 Windows 创建并管理一个专用的本地标准用户,实现自动登录 -->
      <AutoLogonAccount rs5:DisplayName="前台终端" />
      <DefaultProfile Id="{EDB3036B-780D-487D-A375-69369D8A8F78}" />
    </Config>
  </Configs>
</AssignedAccessConfiguration>

如果是 UWP 应用,则在 KioskModeApp 中指定 AppUserModelId(AUMID)。需要注意的是,UWP 应用更新后 AUMID 可能会发生变化,此时需要更新配置。7 另外,信息亭配置文件只能分配给用户,不能分配给组2

4.4 通过 WMI 网桥实际应用配置

在没有 MDM 的终端上,可以通过MDM 网桥 WMI 提供程序来调用同一个 CSP。这是操作步骤中最容易卡住的环节,因此按顺序详细说明。5

步骤 1:以 SYSTEM 身份启动 PowerShell。设备配置的 WMI 网桥必须在 SYSTEM(LocalSystem)账户下运行。管理员权限的 PowerShell 是不够的。5 官方文档介绍的方法是使用 Sysinternals 的 PsExec

:: 以管理员身份打开命令提示符,启动一个 SYSTEM 权限的交互式 PowerShell
psexec.exe -i -s powershell.exe

步骤 2:确认启动的 PowerShell 是否为 SYSTEM。不做这一步确认就往下走,结果「没报错却不生效」,是常见的情况。

# 显示为 NT AUTHORITY\SYSTEM 即为正确
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name

步骤 3:把 XML 进行 HTML 编码后写入。在该 SYSTEM 权限的 PowerShell 会话中执行。

$assignedAccessConfiguration = @"
<?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" xmlns:v4="http://schemas.microsoft.com/AssignedAccess/2021/config">
  <Profiles>
    <Profile Id="{EDB3036B-780D-487D-A375-69369D8A8F78}">
      <KioskModeApp v4:ClassicAppPath="%ProgramFiles%\Contoso\KenkiPanel.exe" v4:ClassicAppArguments="--line 3" />
      <v4:BreakoutSequence Key="Ctrl+Alt+K" />
    </Profile>
  </Profiles>
  <Configs>
    <Config>
      <AutoLogonAccount rs5:DisplayName="前台终端" />
      <DefaultProfile Id="{EDB3036B-780D-487D-A375-69369D8A8F78}" />
    </Config>
  </Configs>
</AssignedAccessConfiguration>
"@

$namespaceName = "root\cimv2\mdm\dmmap"
$className     = "MDM_AssignedAccess"

$obj = Get-CimInstance -Namespace $namespaceName -ClassName $className
# 不能直接传入 XML,需要先进行 HTML 编码
$obj.Configuration = [System.Net.WebUtility]::HtmlEncode($assignedAccessConfiguration)
Set-CimInstance -CimInstance $obj

步骤 4:重启终端。配置从重启后的登录开始生效。重启后,由 AutoLogonAccount 创建的本地账户会自动登录,并启动指定的应用。5

如需解除配置,同样在 SYSTEM 权限的 PowerShell 中把 Configuration 设为 $null,然后重启。5

$obj = Get-CimInstance -Namespace "root\cimv2\mdm\dmmap" -ClassName "MDM_AssignedAccess"
$obj.Configuration = $null
Set-CimInstance -CimInstance $obj

4.5 如何确认配置是否已生效

为了排查「没报错却不生效」的情况,这里准备三种确认手段。

(a)启用事件日志查看。官方指引的确认位置就是这个通道。7 配置 XML 的校验错误与运行时失败都会显示在这里。

事件查看器
  > 应用程序和服务日志
    > Microsoft
      > Windows
        > AssignedAccess
          > Operational

默认情况下这个通道可能是禁用的,请先选中该通道,点击右侧窗格的「启用日志」,然后再重现问题。

(b)在注册表中确认已写入的配置。Assigned Access 的配置会记录在以下键中。7

内容
HKLM\Software\Microsoft\Windows\AssignedAccessConfiguration 应用于终端的配置
HKLM\Software\Microsoft\Windows\AssignedAccessCsp 通过 CSP 设置的配置
HKCU\SOFTWARE\Microsoft\Windows\AssignedAccessConfiguration 应用于该用户的配置

(c)从 CSP 中读回。写入之后,立刻在同一个 SYSTEM 权限的 PowerShell 中读回,就能当场确认值是否已经写入。

$obj = Get-CimInstance -Namespace "root\cimv2\mdm\dmmap" -ClassName "MDM_AssignedAccess"
$obj.Configuration

# 如果返回的仍是编码状态、不便阅读,可以解码后再肉眼查看
[System.Net.WebUtility]::HtmlDecode($obj.Configuration)

如果这里是空的,说明应用本身失败了;如果已经写入却不生效,就要怀疑 XML 的内容(应用路径、Profile 与 Config 的 GUID 不一致、版本要求)。如果步骤 3 出现错误,请先回到步骤 2 确认 SYSTEM 身份。

5. 用 Shell Launcher 把 Win32 应用做成外壳

如果能使用 Enterprise 系列版本,那么对于像设备操作画面这类「Explorer 的存在本身就是障碍」的终端,Shell Launcher 是最有力的选择。Shell Launcher v2(Windows 10 1809 及以后)用 CustomShellHost.exe 代替 Explorer.exe 来启动并监视业务应用,无论 Win32 还是 UWP 都可以做成外壳。3

配置使用专用的 XML,最大的特点是可以按退出代码分别声明应用退出时的恢复动作4

<ShellLauncherConfiguration
    xmlns="http://schemas.microsoft.com/ShellLauncher/2018/Configuration"
    xmlns:V2="http://schemas.microsoft.com/ShellLauncher/2019/Configuration">
  <Profiles>
    <DefaultProfile>
      <!-- 维护人员等未分配配置文件的用户,使用普通的 Explorer -->
      <Shell Shell="%SystemRoot%\explorer.exe" />
    </DefaultProfile>
    <Profile Id="{自己生成的GUID}">
      <Shell Shell="%ProgramFiles%\Contoso\KensaPanel.exe" V2:AppType="Desktop"
             V2:AllAppsFullScreen="true">
        <ReturnCodeActions>
          <ReturnCodeAction ReturnCode="0"  Action="RestartShell"/>   <!-- 正常退出→重启 -->
          <ReturnCodeAction ReturnCode="10" Action="RestartDevice"/>  <!-- 要求重启终端 -->
        </ReturnCodeActions>
        <DefaultAction Action="RestartShell"/>
      </Shell>
    </Profile>
  </Profiles>
  <Configs>
    <Config>
      <AutoLogonAccount/>  <!-- 自动创建并自动登录本地标准用户「Kiosk」 -->
      <Profile Id="{自己生成的GUID}"/>
    </Config>
  </Configs>
</ShellLauncherConfiguration>

Profile Id 的 GUID 并不是要向某处申请发放的东西。它是你自己生成的、只需在 XML 内保持唯一即可的值,可以用 PowerShell 的 New-Guid 生成。4

# 生成一个带花括号的形式。把这个字符串粘贴到 XML 中
"{$((New-Guid).Guid.ToUpper())}"

请把生成的值以相同的形式(含花括号)同时写入 Profiles 一侧和 Configs 一侧。之所以直接复制上面的示例无法运行,就是因为需要做这个替换。第 4 章 Assigned Access 配置 XML 中出现的 Profile Id / DefaultProfile Id 也是同样性质的值。

动作共有 RestartShell / RestartDevice / ShutdownDevice / DoNothing 四种。如果退出代码没有对应的映射,DefaultAction 也未定义,就会「什么都不发生」,也就是停在黑屏状态。请务必定义 DefaultAction。4 应用方式:使用 MDM 时通过 ./Vendor/MSFT/AssignedAccess/ShellLauncher;本地场景则与 Assigned Access 一样,通过 WMI 网桥把 XML 设置到 MDM_AssignedAccessShellLauncher 属性中。6 根据环境不同,有时需要事先在「启用或关闭 Windows 功能」中,启用设备锁定功能下的 Shell Launcher 功能(Client-EmbeddedShellLauncher)。

下面列举 Shell Launcher 特有的三个陷阱。3

  • 启动另一个进程后自身就退出的应用无法做成外壳。由于 Shell Launcher 监视的是指定进程的退出,如果指定了启动器(launcher)型的 EXE(官方文档中的例子是 write.exe),会立刻被判定为「已退出」。
  • 外壳会以登录用户的权限运行。如果把外壳分配给管理员账户,就能以该权限做任何事;如果外壳应用本身要求管理员提权,则必须禁用 UAC 才能启动。应该在此之前就把应用设计成无需提权。
  • Shell Launcher 并不阻止其他应用的启动。因为它只是替换外壳,通过业务应用内的文件对话框启动 EXE 之类的路径依然存在。对于不能信任操作者的终端,应并用 AppLocker 或 Keyboard Filter。

6. 运维设计 ── 自动登录・恢复・更新・维护途径

选定方式并完成配置并不是终点。让终端能够无人值守持续运转的设计,才是信息亭模式的核心。

自动登录的首选方案是配置 XML 中的 AutoLogonAccount。由于 Windows 会自行创建并管理专用的本地标准用户,因此不需要保管密码。24 传统的 Winlogon 注册表方式(AutoAdminLogon/DefaultUserName/DefaultPassword)也可以使用,但密码会以明文形式残留。另外,在应用了 EAS 密码限制的终端上,自动登录按规范将无法工作,请确认是否与 MDM 策略发生冲突。7

应用崩溃时的一线恢复交给操作系统处理。Assigned Access 信息亭模式在应用关闭后会自动重启。1 Shell Launcher 则通过 DefaultAction/ReturnCodeActions 配置恢复动作。4 在此基础上,为应对「重启后仍以相同异常持续崩溃」的情况,预先设置夜间定期重启任务可以提高恢复能力(任务的具体做法请参见「任务计划程序的任务不执行、以 0x1 结束 ── 原因排查与安全的运维设计」)。

Windows Update 不应被完全停用,而应控制其时间。官方推荐的配置是:将活动时间对齐营业时间,采用自动下载 + 夜间计划安装,并关闭包括重启警告在内的通知。7 请在真实设备上确认重启后能够自动衔接到「自动登录 → 恢复信息亭模式」这一整条链路。电源设置同理,应把睡眠与关闭显示器的超时都设为 0(禁用),并禁用电源按钮。7 由笔记本电脑改用的终端以及 Modern Standby 机型的行为尤其特殊,请一并确认「睡眠、休眠、Modern Standby 与长时间运行应用 ── 用设计防止「夜里意外停止」」。

键盘与触控方面的漏洞因方式而异。在多应用信息亭模式(受限用户体验)中,Alt+F4・Alt+Tab・Ctrl+Alt+Del 默认不会被屏蔽7 用来堵住这些漏洞的是 Keyboard Filter,它可以同时抑制物理键盘与屏幕键盘的组合键(用 Dism /online /Enable-Feature /FeatureName:Client-KeyboardFilter 启用,仅限 Enterprise 系列)。8 对于平板类终端,应将 LockDown/AllowEdgeSwipe 策略设为禁用(0),防止从屏幕边缘滑动唤出系统 UI。

确保维护途径与「堵漏洞」同样重要。Assigned Access 信息亭模式的默认退出方式是 Ctrl+Alt+Del(Windows 11 上可以用 BreakoutSequence 更改),然后从那里以管理员账户登录。2 如果用 Keyboard Filter 把 Ctrl+Alt+Del 也屏蔽了,那么 Keyboard Filter 一侧的中断键(默认是连按 5 次左 Windows 键)就成为返回欢迎屏幕的最后一条途径。8 另外,Keyboard Filter 在安全模式下不生效,也可以将管理员账户设为例外。8 信息亭体验本身仅限控制台使用,但可以并用管理员的 RDP 维护,因此保留一条远程途径能减少现场出动的次数。出现问题时,事件日志中的「AssignedAccess > Operational」通道是排查配置错误的一手信息来源。7

7. 业务应用侧的设计与实务定式(判断表)

无论操作系统一侧固化到什么程度,只要应用还是「普通的桌面应用」,就会留下漏洞。下面列举承载在信息亭模式上的应用的设计要求。

  • 自行维持全屏・无边框状态。虽然 Shell Launcher 有 V2:AllAppsFullScreen,但基本原则是应用自身要维持最大化・最前置・无标题栏的状态,并在失去焦点时把自己重新置于前台。
  • 不显示退出按钮。不在画面上放置关闭手段,而是用只有维护人员知道的隐藏操作(例如按顺序点击屏幕四角 + 输入密码)来唤出维护菜单。只要把退出代码区分开,就可以用 Shell Launcher 的 ReturnCodeActions 实现诸如「从维护菜单退出 → 用 DoNothing 恢复到 Explorer」「更新后退出 → 重启终端」这样的联动。4
  • 异常时自我恢复。最糟糕的情况是吞掉未处理异常,画面停留在无法操作的状态。应该写入日志后立即终止自身进程,交给操作系统一侧的重启机制(信息亭模式的自动重启・Shell Launcher 的 RestartShell)来处理。
  • 防止多重启动。自动重启机制与自身的重启处理叠加时,容易发生重复启动。应事先加入基于 Mutex 的多重启动防止机制(「防止 Windows 应用程序重复启动 ── 命名 Mutex 与重复执行时的窗口前置」)。
  • 不要求提权。信息亭账户原则上应为标准用户,在 Shell Launcher 中,如果外壳需要提权,就会被迫禁用 UAC。3 应事先把需要管理员权限的处理分离出来(「在 Windows 应用中把「仅需管理员权限的处理」分离出来的具体写法」)。

最后是判断表。

论点 选项 判断依据
方式选定 仅自动登录 / Assigned Access / 多应用 / Shell Launcher 供不特定人员使用的单应用终端选单应用信息亭模式。使用几个应用的共享终端选多应用。想彻底消除 Explorer 的设备终端选 Shell Launcher(仅限 Enterprise 系列)。仅靠自动登录不可行13
Win32 应用的信息亭化 Shell Launcher / Windows 11 的 ClassicAppPath / UWP 化 Windows 11 上 Pro + Assigned Access 即可满足。Windows 10 Pro 需要 UWP 化或多应用 + AutoLaunch,实在不行就更换版本2
自动登录 直接写注册表 / XML 的 AutoLogonAccount XML 方式可以把账户创建・管理交给 Windows,不会残留明文密码24
崩溃后的恢复 自建监控进程 / 操作系统重启机制 + 定期重启 信息亭模式内置自动重启。Shell Launcher 必须定义 DefaultAction。针对连续崩溃,并用夜间重启作为对策14
屏蔽快捷键 不做处理 / Keyboard Filter 多应用模式下 Alt+F4 等组合键会被放行。Enterprise 系列可用 Keyboard Filter 屏蔽,并保留中断键作为维护途径78
维护途径 全部堵死 / 设计脱出键 + 管理员 RDP 记录 BreakoutSequence 与中断键,同时确保远程维护途径。「谁都进不去的终端」是事故28

8. 总结

  • 「自动登录 + 启动项启动」不是信息亭模式。只要 Explorer 还活着就守不住任何东西,因此应该使用 Assigned Access 或 Shell Launcher。
  • Assigned Access 在 Pro 及以上版本可用,可以配置单应用信息亭模式(UWP/Edge,Windows 11 上也支持 Win32)以及多应用受限用户体验。
  • Shell Launcher 是把 Explorer.exe 替换为业务应用的机制,仅限 Enterprise / Education / IoT Enterprise 系列,可以按退出代码分别声明恢复动作(RestartShell 等)。
  • 配置已统一到 AssignedAccess CSP 中,即使没有 MDM,也可以通过 WMI 网桥 + PowerShell(SYSTEM 权限)应用同一份 XML。
  • 运维设计的骨架是:通过 AutoLogonAccount 实现自动登录、依靠操作系统重启机制 + 定期重启实现恢复、控制 Windows Update 的时间,以及通过 BreakoutSequence、中断键、远程维护确保脱出途径。
  • 最后一道防线是业务应用的设计。只有同时满足维持全屏・不显示退出按钮・异常时自我恢复・防止多重启动・无需提权,「只运行一个应用的电脑」才算真正完成。

相关文章

相关咨询领域

合同会社小村软件承接前台终端・工厂操作终端・检测设备操作画面等信息亭终端的方式选定与配置、能够承受信息亭模式考验的业务应用(全屏 UI・自我恢复・权限分离)设计与开发,以及既有终端的「重新固化」。

参考链接

  1. Microsoft Learn,Assigned Access overview。关于 Assigned Access 在 Pro / Enterprise(含 LTSC)/ Education / IoT Enterprise(含 LTSC)上受支持,信息亭体验中 UWP 应用或 Microsoft Edge 会在锁屏界面之上全屏运行、关闭后自动重启,信息亭体验要求启用 UAC 并从控制台登录、不支持远程桌面连接,以及受限用户体验(多应用)的定位。  2 3 4 5 6 7 8 9

  2. Microsoft Learn,Create an Assigned Access configuration file。关于 KioskModeApp 的 AppUserModelId 与 v4:ClassicAppPath / v4:ClassicAppArguments(Windows 11 21H2 架构)、脱出键默认为 Ctrl+Alt+Del、可用 BreakoutSequence 元素更改、AllAppsList 配置会生成 AppLocker 规则、rs5:AutoLaunch、AutoLogonAccount 会创建并管理本地标准用户、KioskModeApp 与 ShellLauncher 不能在同一设备上同时配置,以及信息亭配置文件不能分配给组。  2 3 4 5 6 7 8 9 10 11 12 13 14

  3. Microsoft Learn,Shell Launcher overview。关于 Shell Launcher 是把 Explorer.exe 替换为 Win32/UWP 应用的功能,支持的版本为 Enterprise / Enterprise LTSC / Education / IoT Enterprise / IoT Enterprise LTSC,v2 用 CustomShellHost.exe 同时支持 Win32/UWP,其本身不阻止对其他应用的访问、需要并用 AppLocker 等,启动其他进程后自身退出的应用无法做成外壳,以及外壳以登录用户的权限运行、需要提权时必须禁用 UAC。  2 3 4 5 6 7 8 9

  4. Microsoft Learn,Create a Shell Launcher configuration file。关于 ShellLauncherConfiguration XML 的结构(Profiles/Shell/Configs)、Profile Id 的 GUID 只需在 XML 内唯一即可、可用 PowerShell 的 New-Guid 生成,V2:AppType 与 V2:AllAppsFullScreen,退出时的动作共有 RestartShell / RestartDevice / ShutdownDevice / DoNothing 四种,退出代码没有映射且 DefaultAction 也未定义时将什么都不发生、因此应定义 DefaultAction,以及 AutoLogonAccount 会创建并管理本地标准用户「Kiosk」。  2 3 4 5 6 7 8 9 10

  5. Microsoft Learn,Quickstart: Configure a single-app kiosk with Assigned Access。关于在「设置」应用(账户 > 其他用户 > 设置信息亭模式 > 开始 > 创建账户 > 选择应用 > 关闭)中的配置步骤,通过 AssignedAccess CSP(./Vendor/MSFT/AssignedAccess/Configuration)应用配置,在 SYSTEM 权限的 PowerShell 中使用 WMI 网桥(命名空间 root\cimv2\mdm\dmmap,MDM_AssignedAccess 类的 Configuration 属性)的步骤,设备配置的 WMI 网桥要求以 SYSTEM(LocalSystem)账户运行,可以用 psexec.exe -i -s powershell.exe 进行测试,把 XML 进行 HtmlEncode 后用 Set-CimInstance 设置,配置完成后重启终端会自动登录并启动信息亭应用,以及把 Configuration 设为 $null 并重启的解除方法。  2 3 4 5 6 7 8

  6. Microsoft Learn,Quickstart: Configure a single-app kiosk with Shell Launcher。关于通过 AssignedAccess CSP 的节点(./Vendor/MSFT/AssignedAccess/ShellLauncher)或 WMI 网桥(MDM_AssignedAccess 类的 ShellLauncher 属性)应用 Shell Launcher 的 XML 的步骤及解除方法。  2

  7. Microsoft Learn,Assigned Access recommendations。关于建议把信息亭账户设为权限最小的本地标准用户,通过 Winlogon 注册表设置自动登录,以及在应用了 EAS 密码限制时自动登录将无法工作,Windows Update(活动时间・计划安装・关闭通知)与电源设置的推荐配置,受限用户体验下 Alt+F4・Alt+Tab・Ctrl+Alt+Del 不会被屏蔽,UWP 应用更新可能导致 AUMID 变化,可以在「应用程序和服务日志 > Microsoft > Windows > AssignedAccess > Operational」中启用故障排查用日志,以及配置记录所在的注册表键(HKLM\Software\Microsoft\Windows\AssignedAccessConfiguration、HKLM\Software\Microsoft\Windows\AssignedAccessCsp、HKCU\SOFTWARE\Microsoft\Windows\AssignedAccessConfiguration)。  2 3 4 5 6 7 8 9 10 11

  8. Microsoft Learn,Keyboard Filter。关于 Keyboard Filter 可以在物理键盘与屏幕键盘上抑制包括 Ctrl+Alt+Del 在内的组合键,支持的版本为 Enterprise / Education / IoT Enterprise 系列,通过 DISM(Client-KeyboardFilter)启用,可以用中断键(默认为连按 5 次左 Windows 键)返回欢迎屏幕,可对管理员账户设置例外,在安全模式下不生效,以及不支持远程桌面会话。  2 3 4 5 6

  9. Microsoft Learn,Set-AssignedAccess。关于 Set-AssignedAccess cmdlet 会把指定用户配置为专用于单个应用商店应用(UWP),对象仅限本地标准用户、不能指定管理员或域账户,以及用 Clear-AssignedAccess 解除配置。 

  10. Microsoft Learn,Get-StartApps。关于 Get-StartApps 会获取当前用户已安装应用的名称与 AppID(AppUserModelID),可以用 -Name 通过含通配符的名称进行筛选,以及输出对象包含 Name 与 AppID 属性。  2

共享相同标签的最新文章。可以围绕相近的主题进一步加深理解。

与本文相近的主题页面。以本文为起点,可以进一步了解相关服务和其他文章。

常见问题

汇总了咨询这一主题时常见的问题。

Assigned Access 在 Windows Pro 上也能使用吗?
可以使用。Assigned Access(单应用信息亭模式与多应用受限用户体验)在 Pro / Enterprise / Education / IoT Enterprise(分别包含各自的 LTSC)版本上均受支持。另一方面,将 Explorer.exe 本身替换为业务应用的 Shell Launcher 仅限于 Enterprise / Education / IoT Enterprise 系列,Pro 无法使用。此外,信息亭体验要求启用 UAC 并从控制台登录,通过远程桌面连接使用信息亭体验不受支持。
要把 Win32(桌面)应用做成信息亭模式,是否必须使用 Shell Launcher?
在 Windows 11 上已不再是必须的。Windows 11(21H2 及以后架构)的 Assigned Access 可以通过 KioskModeApp 元素的 v4:ClassicAppPath 属性指定桌面应用的可执行文件路径,即使在 Pro 终端上也能配置 Win32 应用的单应用信息亭模式。而 Windows 10 的 Assigned Access 信息亭模式仅限于 UWP 应用与 Microsoft Edge,因此如果只想运行一个 Win32 应用,现实的解决方案是使用 Shell Launcher(仅限 Enterprise 系列),或者在多应用配置中使用 AutoLaunch。请先确认版本与方式的对应关系,再进行设计。
信息亭应用异常退出后会自动恢复吗?
行为因方式而异。Assigned Access 的单应用信息亭模式规定:应用被关闭后会自动重新启动。在 Shell Launcher 中,可以通过 DefaultAction 与 ReturnCodeActions 以声明方式配置作为外壳的应用退出时的行为,可从 RestartShell(重启外壳)・RestartDevice(重启终端)・ShutdownDevice・DoNothing 中选择。如果某个退出代码没有对应的动作定义,且也没有 DefaultAction,则什么都不会发生,画面会停在黑屏状态,因此务必要定义 DefaultAction。应用一侧也需要设计成:在出现未处理异常时自行终止,从而衔接到恢复机制。
维护人员应该如何以管理员身份登录?
Assigned Access 的信息亭体验默认可以通过 Ctrl+Alt+Del 退出到登录界面,在 Windows 11 上可以用 BreakoutSequence 元素更改这个组合键。在用 Keyboard Filter 把 Ctrl+Alt+Del 也一并屏蔽的配置中,可以保留 Keyboard Filter 一侧的中断键(默认是连按 5 次左 Windows 键)作为返回欢迎屏幕的途径。信息亭体验本身仅限控制台使用,但可以并用管理员账户的远程桌面维护作为另一个会话。重要的是不要把所有脱身途径都堵死,变成只能靠现场作业才能恢复的终端。
把自动登录密码写在注册表里安全吗?
不建议这样做。Winlogon 的 AutoAdminLogon 方式会让 DefaultPassword 以明文形式残留在注册表中。Assigned Access 与 Shell Launcher 的配置 XML 中都有 AutoLogonAccount 元素,使用它可以让 Windows 自行创建和管理一个专用的本地标准用户并自动登录,因此不需要自己保管密码。原则上,信息亭账户应设为权限最小的本地标准用户,避免挪用域账户。另外还需注意,在应用了 Exchange ActiveSync 密码限制策略的终端上,自动登录将无法工作。

作者简介

本文作者的个人简介页面。

Go Komura

小村软件有限公司 代表

以 Windows 软件开发、技术咨询与故障排查为中心,擅长难以复现的故障调查,以及既有资产仍在运行的项目。

返回博客列表